当前位置: 首页 > news >正文

LeetCode题练习与总结:回文对--336

一、题目描述

给定一个由唯一字符串构成的 0 索引 数组 words 。

回文对 是一对整数 (i, j) ,满足以下条件:

  • 0 <= i, j < words.length
  • i != j ,并且
  • words[i] + words[j](两个字符串的连接)是一个回文串。

返回一个数组,它包含 words 中所有满足 回文对 条件的字符串。

你必须设计一个时间复杂度为 O(sum of words[i].length) 的算法。

示例 1:

输入:words = ["abcd","dcba","lls","s","sssll"]
输出:[[0,1],[1,0],[3,2],[2,4]] 
解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]

示例 2:

输入:words = ["bat","tab","cat"]
输出:[[0,1],[1,0]] 
解释:可拼接成的回文串为 ["battab","tabbat"]

示例 3:

输入:words = ["a",""]
输出:[[0,1],[1,0]]

提示:

  • 1 <= words.length <= 5000
  • 0 <= words[i].length <= 300
  • words[i] 由小写英文字母组成

二、解题思路

1. 创建一个HashMap,用于存储每个单词及其索引。

2. 遍历words数组,对于每个单词word,进行以下操作: 

  • a. 将word反转,得到反转后的字符串rev。 
  • b. 检查rev是否在HashMap中,如果在,并且rev的索引不等于当前单词的索引,则将当前单词的索引和rev的索引作为一个回文对添加到结果列表中,但需要注意确保word本身不是回文。 
  • c. 对于每个单词word,将其拆分为前缀和后缀,分别检查前缀和后缀是否为回文。如果是,则在HashMap中查找相应的后缀和前缀,并添加到结果列表中,但需要注意确保后缀或前缀不为空字符串,除非另一个单词为空字符串。

3. 返回结果列表。

三、具体代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;class Solution {public List<List<Integer>> palindromePairs(String[] words) {List<List<Integer>> res = new ArrayList<>();HashMap<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 word = words[i];int len = word.length();for (int j = 0; j <= len; j++) {// 分割成前后缀String prefix = word.substring(0, j);String suffix = word.substring(j);// 如果前缀是回文,则查找反转后的后缀if (isPalindrome(prefix)) {String revSuffix = new StringBuilder(suffix).reverse().toString();if (map.containsKey(revSuffix) && map.get(revSuffix) != i && (suffix.length() == 0 || j != 0)) {res.add(Arrays.asList(map.get(revSuffix), i));}}// 如果后缀是回文,则查找反转后的前缀if (isPalindrome(suffix)) {String revPrefix = new StringBuilder(prefix).reverse().toString();if (map.containsKey(revPrefix) && map.get(revPrefix) != i) {res.add(Arrays.asList(i, map.get(revPrefix)));}}}}return res;}// 判断字符串是否为回文private boolean isPalindrome(String s) {int left = 0, right = s.length() - 1;while (left < right) {if (s.charAt(left++) != s.charAt(right--)) {return false;}}return true;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 创建HashMap存储单词及其索引:O(n * k),其中n是单词数组的长度,k是单词的平均长度。这是因为每个单词都需要被插入到HashMap中。

  • 遍历单词数组,对于每个单词word,我们再次遍历其所有可能的前缀和后缀:O(n * k^2)。这是因为对于每个单词,我们执行了k次操作(每次操作是分割单词并检查前缀或后缀是否为回文),每次操作需要O(k)时间(字符串分割和回文检查)。

  • 在每次检查中,我们可能执行了字符串反转和HashMap查找操作:O(k)。

因此,总的时间复杂度是O(n * k^2),因为这是最大的部分,它支配了总运行时间。

2. 空间复杂度
  • HashMap存储单词及其索引:O(n * k),其中n是单词数组的长度,k是单词的平均长度。

  • 结果列表res:在最坏情况下,如果每个单词都能与数组中的其他单词形成回文对,则结果列表的大小将是O(n^2)。

  • 辅助空间,如字符串反转和临时字符串变量:O(k)。

因此,总的空间复杂度是O(n * k + n^2),其中n * k是HashMap的空间,n^2是结果列表的空间。在大多数情况下,n^2可能是最大的部分,因此空间复杂度可以简化为O(n^2)。但是,如果单词长度远大于单词数量,那么HashMap的空间可能会成为主导因素,此时空间复杂度将是O(n * k)。

五、总结知识点

  • 数据结构

    • ArrayList:用于存储结果列表,它是一个可调整大小的数组实现,提供了比标准数组更多的灵活性。
    • HashMap:用于存储单词及其索引的映射,它提供了快速的查找功能。
  • 字符串操作

    • substring:用于获取字符串的子串。
    • StringBuilder:用于构建字符串,特别是进行字符串反转操作。
  • 循环和条件语句

    • for循环:用于遍历数组或进行重复操作。
    • if语句:用于条件判断。
  • 算法逻辑

    • 回文检测:通过比较字符串的前后字符来检查一个字符串是否是回文。
    • 字符串分割:将字符串分割成前缀和后缀,用于检查不同组合是否可以形成回文对。
  • 函数定义和调用

    • private boolean isPalindrome(String s):定义了一个私有辅助函数,用于检查字符串是否为回文。
    • Arrays.asList(...):用于创建并返回一个固定大小的列表。
  • 错误处理和边界条件

    • 检查前缀或后缀是否为空字符串,以及是否与原字符串索引相同,以避免无效的回文对。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.mrgr.cn/news/59509.html

相关文章:

  • Flink CDC系列之:调研应用Flink CDC将 ELT 从 MySQL 流式传输到 StarRocks方案
  • 【leetcode】动态规划
  • <Project-11 Calculator> 计算器 0.3 年龄计算器 age Calculator HTML JS
  • K8s中TSL证书如何续期
  • QT编辑框带行号
  • uniapp路由权限拦截守卫
  • 008:光盘映像文件处理工具UltraISO安装教程
  • Python实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪、重建、填补
  • 【汇编语言】第一个程序(二)—— 带你真正了解一个源程序的结构是怎样的
  • 背包九讲——二维费用背包问题
  • 基于SSM平面设计课程在线学习系统的设计
  • 504 Gateway Time-outopenresty
  • 684. 冗余连接
  • w~视觉~合集10
  • 深度学习模型预测控制python tensorflow 实现
  • Rust 力扣 - 3. 无重复字符的最长子串
  • Spring Cache-基于注解的缓存
  • 以蚂蚁借呗、抖音放心借、美团借钱为例,聊聊企业如何计算期末资产收益率
  • C++和OpenGL实现3D游戏编程【连载16】——详解三维坐标转二维屏幕坐标(向量和矩阵操作实战)
  • (六)问题记录,simulink仿真出现模型碰撞后穿越
  • 【ChatGPT】如何利用ChatGPT进行复杂任务的分解
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法
  • 信息安全入门——网络安全威胁
  • list补充
  • apply,call,bind手写
  • 质量漫谈一