C++中如何忽略大小写差异检测Anagram?现有代码修改求助
解决Anagram检测忽略大小写的问题
嘿,我来帮你搞定这个大小写忽略的问题!先帮你修正下现有代码里的几个小bug,再加上大小写不敏感的处理逻辑。
先看现有代码的小问题:
int pos = (s2.find(s1[i]);这里多了一个左括号,属于语法错误pos的类型应该用size_t(因为string::find返回的是无符号的size_t),用int的话判断pos < 0会出错——无符号数永远不会小于0,正确的不存在判断应该是pos == string::npos- 函数末尾多余了一个
return false;,完全没用
接下来是核心的忽略大小写的处理,有两种简单的思路:
思路1:统一转换为小写(或大写)后再检测
这是最直观的方法:先把两个字符串的所有字符都转成小写(或大写),这样原来的检测逻辑就可以直接复用了。
修改后的代码如下(记得包含<cctype>头文件来用tolower函数):
#include <string> #include <cctype> // 必须包含这个头文件 bool isAnagram(std::string s1, std::string s2){ // 长度不同直接返回false if(s1.length() != s2.length()) return false; // 将两个字符串统一转为小写 for(char& c : s1) { // 用static_cast<unsigned char>避免有符号char的未定义行为 c = std::tolower(static_cast<unsigned char>(c)); } for(char& c : s2) { c = std::tolower(static_cast<unsigned char>(c)); } for(size_t i = 0; i < s1.length(); i++){ size_t pos = s2.find(s1[i]); // 用size_t匹配find的返回类型 if(pos == std::string::npos) // 判断字符是否不存在 return false; s2.erase(pos, 1); // 找到后删除该字符 } return true; }
为什么要加static_cast<unsigned char>?
因为std::tolower的参数要求是int类型,且如果传入的是负数(比如某些有符号char的扩展ASCII字符)会导致未定义行为。把char转成unsigned char再转成int,就能避免这个问题。
思路2:查找时直接忽略大小写
如果你不想修改原字符串(虽然这里函数参数是传值的,修改也不影响外部),可以在查找字符的时候直接忽略大小写,用std::find_if配合lambda表达式实现:
#include <string> #include <algorithm> // 用于std::find_if #include <cctype> bool isAnagram(std::string s1, std::string s2){ if(s1.length() != s2.length()) return false; for(char c1 : s1) { char target = std::tolower(static_cast<unsigned char>(c1)); // 在s2中查找和target小写相等的字符 auto it = std::find_if(s2.begin(), s2.end(), [target](char c2) { return std::tolower(static_cast<unsigned char>(c2)) == target; }); if(it == s2.end()) { // 没找到就返回false return false; } s2.erase(it); // 找到后删除该字符 } return true; }
两种方法都能实现忽略大小写的Anagram检测,第一种更简单易读,适合大多数场景;第二种不需要提前修改整个字符串,逻辑更灵活。
内容的提问来源于stack exchange,提问作者LEO
相关产品推荐
相关产品推荐

