回文对。
示例:
给定一组互不相同的单词,找出所有不同的索引对(i,j),使得列表中的两个单词,word[i]+word[j]可以拼接成回文串。
输入:["abcd","dcba","lls","s","sssll"]
输出:[[0,1],[1,0],[3,2],[2,4]]
解释:可拼接成回文串为
["abcddcba","dcbaabcd","slls","llssssll"]
输入:["bat","tab","cat"]
输出:[[0,1],[1,0]]
解释:可拼接成回文串为
["battab","tabbat"]
枚举前缀和后缀
1、循环找出每一个字符串的回文段以及该段的回文串
比如:abcd
第一个回文段为空,对应的回文串是dcba
第二个回文段为a,对应的回文串是dcb
第三个回文段为d,对应的回文串是cba
所以只要有dcba和dcb和cba就能和abcd组成回文串
# -*- coding:UTF-8 -*-
class Solution:
def palindromePairs(self, words):
resultP=[]
wordDict = {w:i for i in enumerate(words)}
for word in words:
pre,suf = self.is_palindrome(word)
for p in pre:
if p in wordDict.keys() and wordDict[p]!=words.index(word) and word[::-1] != p:
#去掉单个值的字符串和本身组成回文串;去掉本身反转后一模一样的前缀,因为该前缀是words里面的参数时,在后缀中也会被计入
resultP.append([wordDict[p],words.index(word))
for s in suf:
if s in wordDict.keys() and wordDict[s]!=words.index(word):
resultP.append([words.index(word),wordDict[s])
return resultP
def is_palindrome(self,str):
pre = []
suf = []
for i in range(len(str)+1):
if str[:i] == str[:i][::-1]:
pre.append(str[i:][::-1])
if str[i:] == str[i:][::-1]:
suf.append(str[:i][::-1])
return pre,suf
words=["abcd","dcba","lls","s","sssll"]
result = Solution()
print(result.palindromePairs(words))