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

时间:2016-07-18 19:28:26

标签: c++

我对编程很新。我需要比较具有完全相同元素但顺序不同的两个字符串。我已尝试使用start_pt = temp.find("\"") end_pt = temp.find("\"", start + 1) # add one to skip the opening " quote = temp[start_pt + 1: end_pt + 1] # add one to get the quote excluding the "" >>> print start_pt, end_pt, quote 10, 16, 'leave' 进行比较但不起作用。我尝试使用我在网上阅读的strcmpi(),用于比较具有相同元素的字符串,但我的编译器说它不存在,即使我包含is_permutation()。我的编译器是Borland C ++。有没有其他方法可以比较2个字符串,并将它们评估为相同的元素,但排列顺序不同? 例如<algorith.h>"evil"

3 个答案:

答案 0 :(得分:2)

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

  2. 正如评论已经指出的那样,你可以sort字符串然后进行比较。

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

答案 1 :(得分:2)

您可以计算每个字符在每个字符串上出现的次数,如果它们相等则返回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;
}

答案 2 :(得分:1)

正如内森奥利弗所建议的,将两者排序,然后检查它们是否相等。源代码是:

#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;
}