难度:困难
题目描述:
总结思路:这个题暴力法是肯定行不通的,O(n^3)的复杂度。想想怎么优化,一种思路是找其中特殊情况,不过这种如果自己慢慢调费时费力。还有一种可以降复杂度的思路就是拆分每个单词,通过判断回文串的方法(逆序=正序),在剩余字符串中找到相匹配的回文。这个时间复杂度应该为
这题还可以同时了解一下Python的切片原理
题解一:
"""
算法:
1.遍历每个单词;
2.对于任意前缀如果是回文,那么后缀的逆序j能找到,那么结果就是(j,i);
3.对于任意后缀如果是回文,那么前缀的逆序j能找到,那么结果就是(i,j).
note:容易遗漏的两个坑
"""
class Solution:
def palindromePairs(self, words: List[str]) -> List[List[int]]:
res = []
for i,w in enumerate(words):
for j in range(len(w)+1): #坑1:这里不加+会漏掉pre和last是整个word的情况,同时也处理的空串情况
pre, last = w[:j], w[j:]
if pre[::-1] == pre and last[::-1]!=w and last[::-1] in words:
res.append([words.index(last[::-1]), i])
#坑2:j!=len(w)处理对称两个word互为回文,重复结果的问题。比如"abcd"和"dcba",在pre和last都为整个word的时候,两个word生成四个结果(这里没解释清楚,日后填坑)
if last[::-1] == last and pre[::-1] != w and pre[::-1] in words and j!=len(w):
res.append([i, words.index(pre[::-1])])
return res