题目简介:
给定一组 互不相同 的单词, 找出所有不同 的索引对(i, j)
,使得列表中的两个单词, words[i] + words[j]
,可拼接成回文串。
示例 1:
1 | 输入:["abcd","dcba","lls","s","sssll"] |
示例 2:
1 | 输入:["bat","tab","cat"] |
思路:
对于字符串s1
,s2
,若s1 + s2
能组成回文串,那么有以下三种情况:
len_s1 = len_s2
,那么s1
的翻转就是s2
。len_s1 > len_s2
,那么s1
能分成两个部分t1, t2
。其中t1
的翻转为s2
,t2
为回文串。len_s1 < len_s2
,那么s2
能分成两个部分t1, t2
。其中t1
的翻转为s1
,t2
为回文串。
所以我们首先定义一个哈希表,将每个单词的翻转映射为单词的索引下标。
然后对于每个单词,我们尝试找到一个切割点j
,使左右两部分至少有一部分为回文串。
若左部分
words[0 ... j - 1]
为回文串,那么我们就尝试在哈希表中找到右部分的翻转,下标记为right_id
,那么words[right_id] + words[i]
为回文串,并将下标压入答案数组。若右部分
words[j ... m - 1]
为回文串(m
为单词的长度),那么我们就尝试在哈希表中找到左部分的翻转,下标记为left_id
,那么words[i] + words[left_id]
为回文串,并将下标压入答案数组。
tips:
- 对于判断字符串是否为回文串的函数
judge()
,需要注意函数实现中循环的条件参数,不要弄错。 - 为了数组的去重,压入数组前需要经过
check()
函数的判断。 - 因为找的是不同的索引对,所以
right_id, left_id
不能等于i
本身。 - 默认空字符串也为回文串。
代码如下:
1 | class Solution { |