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 分钟前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
问好眼7 分钟前
【信息学奥赛一本通】1275:【例9.19】乘积最大
c++·算法·动态规划·信息学奥赛
Daydream.V25 分钟前
逻辑回归实例问题解决(LogisticRegression)
算法·机器学习·逻辑回归
代码无bug抓狂人26 分钟前
C语言之表达式括号匹配
c语言·开发语言·算法
不穿格子的程序员33 分钟前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法
Nebula_g40 分钟前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
rit84324991 小时前
基于MATLAB的环境障碍模型构建与蚁群算法路径规划实现
开发语言·算法·matlab
hoiii1871 小时前
MATLAB SGM(半全局匹配)算法实现
前端·算法·matlab
独自破碎E1 小时前
大整数哈希
算法·哈希算法
纤纡.1 小时前
逻辑回归实战进阶:交叉验证与采样技术破解数据痛点(二)
算法·机器学习·逻辑回归