比较C++中字母相同但顺序不同的字符串

Comparing strings in C++ that have the same letters but in different order

本文关键字:顺序 字符串 C++ 比较      更新时间:2023-10-16

我对编程还很陌生。我需要比较两个元素完全相同但顺序不同的字符串。我尝试过使用strcmpi()进行比较,但它不起作用。我试着使用我在网上读到的is_permutation(),它用于比较具有相同元素的字符串,但我的编译器说它不存在,即使我包含了<algorith.h>。我的编译器是Borland C++。有没有其他方法可以比较两个字符串,并用相同的元素将它们计算为相等,但排列顺序不同?例如CCD_ 4和CCD_。

  1. 您的编译器是旧的。我没有检查,但我很确定它不支持std::is_permutation所需的C++11。

  2. 正如评论已经指出的那样,您只需sort字符串,然后对它们进行比较。

  3. 正如评论中所指出的,你试图包含的头是非标准的/不正确的(同样可能是因为你使用了一个古老的编译器-已经有了一个现代的编译器;VS2015、GCC 6.1和Clang 3.8都可以免费获得,并且都提供了相当好的C++11/C++14支持)。

您可以计算每个字符在每个字符串上出现的次数,如果相等,则返回true。

#include <iostream>
#include <string>
using namespace std;
bool anagrams(string s, string t){
    if(s.length() != t.length())
        return false;
    int chArr[256];
    // Set character's count to 0
    for(int i=0; i<256; i++)
        chArr[i] = 0;
    for(int i=0; i<s.length(); i++){
        chArr[s[i]]++;
        chArr[t[i]]--;
    }
    for(int i=0; i<256; i++){
        if(chArr[i] != 0)
            return false;
    }
    return true;
}
int main(){
    if(anagrams("hello, olelh"))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    return 0;
}

正如Nathan Oliver所建议的,对两者进行排序,然后检查它们是否相等。源代码是:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool AreAnagrams(string s1, string s2) {
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    return s1 == s2;
}
int main() {
    if (AreAnagrams("evil", "vile"))
        cout << "Are anagrams." << endl;
    else
        cout << "Are not anagrams." << endl;
    return 0;
}