有效的字母异位词

什么是「字母异位词」?

  • 两个词的长度必须一模一样
  • 每个字母出现的次数也完全一样,只是排列顺序不同
  • 比如:
    • s = "anagram"t = "nagaram":都是 7 个字母,a 出现 3 次、n 出现 1 次、g 出现 1 次、r 出现 1 次、m 出现 1 次,只是顺序打乱了 → 是异位词 ✅
    • s = "rat"t = "car":长度一样,但 r vs c → 不是异位词 ❌

思路:

1核心逻辑:长度校验 → 统计字符次数 → 核销次数 → 校验全零,全程围绕「字符出现次数匹配」展开;

2效率优势:时间复杂度 O (n)(仅遍历两次字符串 + 一次数组),空间复杂度 O (1)(数组长度固定 26);

3关键技巧:用c-'a'把字符转成 0-25 的下标,是小写字母计数的经典写法

cpp 复制代码
#include <string>  // 处理字符串的头文件
#include <iostream>  // 处理输入输出的头文件
using namespace std;

class Solution {
public:
    bool isAnagram(string s, string t) {
        // 第一步:先判断长度,长度不一样直接不是异位词
        if (s.size() != t.size()) {
            return false;
        }

        // 第二步:初始化"账本"------26个小写字母,初始次数都是0
        // 下标0对应a,1对应b...25对应z
        int char_count[26] = { 0 };

        // 第三步:统计s中每个字母的出现次数(记账)
        for (char c : s) {
            // c - 'a':把字符转成对应下标(比如a→0,b→1)
            char_count[c - 'a']++;
        }

        // 第四步:遍历t,核销对应字母的次数
        for (char c : t) {
            char_count[c - 'a']--;
            // 优化:如果某一步核销后变成负数,说明t的这个字母比s多,直接返回false
            if (char_count[c - 'a'] < 0) {
                return false;
            }
        }

        // 第五步:检查账本,所有次数都是0才是异位词
        for (int i = 0; i < 26; i++) {
            if (char_count[i] != 0) {
                return false;
            }
        }

        return true;
    }
};

// 测试代码(可以直接运行)
int main() {
    Solution sol;
    // 测试用例1:是异位词
    string s1 = "anagram", t1 = "nagaram";
    // 测试用例2:不是异位词
    string s2 = "rat", t2 = "car";

    cout << boolalpha; // 让输出显示true/false,而不是1/0
    cout << "测试用例1结果:" << sol.isAnagram(s1, t1) << endl; // 输出true
    cout << "测试用例2结果:" << sol.isAnagram(s2, t2) << endl; // 输出false
    return 0;
}
相关推荐
Data_Journal16 小时前
如何使用cURL更改User Agent
大数据·服务器·前端·javascript·数据库
掌心向暖RPA自动化16 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭16 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
时空自由民.16 小时前
蓝牙协议之GAP协议
linux·服务器·网络
竹林81817 小时前
wagmi v2 多链钱包切换:一个 Uniswap 仿盘项目让我踩了三天坑
前端·javascript
donecoding17 小时前
Playwright MCP 页面捕获:Snapshot、截图、HTML 到底选哪个?
前端·ai编程·前端工程化
滕青山17 小时前
在线PDF拆分工具核心JS实现
前端·javascript·vue.js
Smilezyl17 小时前
一个独立开发者,靠一份 markdown 驱动 Claude Code, 用 20 天跑通 9 个包的 monorepo 工程
前端·人工智能·github
技术崽崽17 小时前
不止有 Agent:Cursor 进阶使用技巧全解析
前端
byoass17 小时前
企业云盘与设计软件深度集成:AutoCAD/Revit/SolidWorks插件开发与API集成实战
服务器·网络·数据库·安全·oracle·云计算