You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:15:16