题目简介:
给定一组 互不相同 的单词, 找出所有不同 的索引对(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 { |