C++如何在检查Anagram时忽略上下差异?

C++ How to ignore the difference between upper and lower when checking Anagram?

bool isAnagram(string s1, string s2){
   if(s1.length() != s2.length())
      return false;

  for(int i =0; i <s1.length();i++){
      int pos = (s2.find(s1[i]);
                 if(pos<0)
                 return false;
                 s2.erase(pos,1);

               }
                 return true;

                 return false;

               }

我写了检查Anagram的代码,但忽略了忽略上下差异的要求。我对此一无所知。你能帮助我吗?谢谢!

在比较之前将两者都转换为小写

std::transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
std::transform(s2.begin(), s2.end(), s2.begin(), ::tolower);

简单的方法是将两个字符串都设置为小写(或大写),然后对它们进行排序。如果 s1s2 互为变位词,则结果应该相同。

您可以使用算法库将大写转换为小写。 在循环之前添加下面一行以将其转换为小写。

#include <algorithm>
#include <string>
std::transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
std::transform(s2.begin(), s2.end(), s2.begin(), ::tolower);

您可以简单地使用 STL 的强大功能 algorithm:

#include <iostream>
#include <algorithm>

using namespace std;

bool isSameChar(int a, int b)
{
    return tolower(a) == tolower(b);
}

bool isAnagram(const string& a, const string& b)
{
    return a.size() == b.size()
        && is_permutation(a.begin(), a.end(), b.begin(), isSameChar);
}

int main()
{
    cout << isAnagram("AbcDE", "ebCda") << endl; // true
    cout << isAnagram("AbcDE", "ebCdaa") << endl; // false
    cout << isAnagram("AbcDE", "ebCde") << endl; // false

    return 0;
}