775 · 回文对

步骤 1:理解题意

给定 无重复 单词列表 words,找出所有 不同的下标对 (i, j) ,使得 words[i] + words[j] 构成回文串。

注意:

  • i 可以等于 j 吗?题目说"不同的索引对",且 words 无重复,故 i≠j。
  • 结果只需返回下标对列表,顺序不限。

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

双重循环枚举所有 (i, j),拼接后 O(L) 判断是否回文,总复杂度 O(n²·L),n≤5000 会 TLE。

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

核心观察:

对于拼接串 left + right 要成回文,

  1. left后缀right前缀互为逆串;
  2. 剩余部分自身必须是回文。

预处理:

  • 把每个单词及其下标存入 HashMap<String,Integer>,O(1) 查逆串是否存在。
  • 枚举每个单词 words[i],把它拆成 prefix + suffix,共 L+1 种拆法:
    • prefix 是回文,且 suffix 的逆串存在于 words,则存在 j 使得 (j, i) 成对;
    • suffix 是回文,且 prefix 的逆串存在于 words,则存在 j 使得 (i, j) 成对。

单次检查 O(L),总复杂度 O(n·L²),n≤5000, L≤20 可过。

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

java 复制代码
public List<List<Integer>> palindromePairs(String[] words) {
    List<List<Integer>> ans = new ArrayList<>();
    Map<String, Integer> map = new HashMap<>();
    for (int i = 0; i < words.length; i++) map.put(words[i], i);

    for (int i = 0; i < words.length; i++) {
        String w = words[i];
        int L = w.length();
        for (int cut = 0; cut <= L; cut++) {
            String prefix = w.substring(0, cut);
            String suffix = w.substring(cut);
            // 情况1:prefix 是回文,找 suffix 的逆
            if (isPalindrome(prefix)) {
                String rev = new StringBuilder(suffix).reverse().toString();
                Integer j = map.get(rev);
                if (j != null && j != i) {
                    ans.add(Arrays.asList(j, i));
                }
            }
            // 情况2:suffix 是回文,找 prefix 的逆(避免重复拆空串)
            if (cut != L && isPalindrome(suffix)) {
                String rev = new StringBuilder(prefix).reverse().toString();
                Integer j = map.get(rev);
                if (j != null && j != i) {
                    ans.add(Arrays.asList(i, j));
                }
            }
        }
    }
    return ans;
}

private boolean isPalindrome(String s) {
    int l = 0, r = s.length() - 1;
    while (l < r) if (s.charAt(l++) != s.charAt(r--)) return false;
    return true;
}
  • 时间:O(n·L²)
  • 空间:O(n·L)(哈希表)
  • 可直接 copy 通过 LintCode 775。
相关推荐
你撅嘴真丑3 小时前
第九章-数字三角形
算法
uesowys3 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder3 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮3 小时前
AI 视觉连载1:像素
算法
智驱力人工智能4 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥5 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风5 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風5 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT065 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠6 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法