171 · 乱序字符串

步骤 1:理解题意

"乱序字符串(Anagram)"指字母集合完全相同、顺序可不同的串。

要求:从给定字符串数组 S 中,返回所有属于某个 Anagram 组的成员 (只要该组大小 ≥2)。

输出顺序不限,但每个串只出现一次。

步骤 2:写出暴力/朴素解法

两两比较排序后字符串,O(n²·k log k),k 为串长,超时。

步骤 3:寻找冗余与优化点

  • 关键观察 :Anagram 组的"签名"唯一。
    签名 = 排序后的串,或 26 个字母计数数组。
  • 用哈希表把签名相同的串聚在一起,最后只保留大小 ≥2 的组。
  • 时间 O(n·k),空间 O(n·k)。

步骤 4:给出最优"快刷"版本

用 int26 计数当 key,比排序再 toString 更快:

java 复制代码
public List<String> anagrams(String[] strs) {
    Map<String, List<String>> map = new HashMap<>();
    for (String s : strs) {
        int[] cnt = new int[26];
        for (char c : s.toCharArray()) cnt[c - 'a']++;
        // 把计数数组转成字符串作 key
        String key = Arrays.toString(cnt);
        map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);
    }
    List<String> ans = new ArrayList<>();
    for (List<String> group : map.values()) {
        if (group.size() > 1) ans.addAll(group);
    }
    return ans;
}
  • 时间:O(n·k)
  • 空间:O(n·k)
  • 可直接 copy 进 IDE 通过 LintCode 171。
相关推荐
小羊没烦恼!2 分钟前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.9 分钟前
202609CSP认证P3
算法
云淡风轻~窗明几净1 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心1 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海2 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
荆棘鸟智能2 小时前
短历时洪水预报算法实践:水文模型与 LightGBM 残差订正融合
人工智能·算法·机器人
葫三生3 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle3 小时前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法
avi91113 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
淡海水3 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc