Given a list of unique words, find all pairs of distinct indices (i, j)
in the given list, so that the concatenation of the two words, i.e. words[i] + words[j]
is a palindrome.
Example 1:
Input: ["abcd","dcba","lls","s","sssll"]
Output: [[0,1],[1,0],[3,2],[2,4]]
Explanation: The palindromes are ["dcbaabcd","abcddcba","slls","llssssll"]
Example 2:
Input: ["bat","tab","cat"]
Output: [[0,1],[1,0]]
Explanation: The palindromes are ["battab","tabbat"]
------------------------------------------------------------------------------------------------
能想到把前后缀拿去查Hash表,这题就成功了一半,另外一半是对于空串和本身回文的处理。直接来会有重复,如以下代码,暂时没有太简洁的去重方式list(set(lst))要求lst里面不能包含list,所以只能转成tuple来玩:
class Solution:
def palindromePairs(self, words):
palin_idx = []
pos = {}
for idx, word in enumerate(words):
pos[word[::-1]] = idx
dup = []
for idx, word in enumerate(words):
wl = len(word)
for i in range(0, wl + 1):
left = word[:i]
right = word[i:] if i < wl else ''
if (left == left[::-1] and right in pos and idx != pos[right]):
dup.append([pos[right], idx])
if (right == right[::-1] and left in pos and idx != pos[left]):
dup.append([idx, pos[left]])
res = []
dupset = set()
for item in dup:
if (tuple(item) not in dupset):
dupset.add(tuple(item))
res.append(item)
return res
s = Solution()
print(s.palindromePairs(["abcd","dcba","lls","s","sssll"]))
另外一种玩法是,把空和本身回文的单独拿出来考虑,注意注释那行的问题:
class Solution:
def palindromePairs(self, words):
pos = {}
palin = []
for idx, word in enumerate(words):
pos[word[::-1]] = idx
if (word == word[::-1]):
palin.append(idx)
res = []
for idx, word in enumerate(words):
wl = len(word)
if (wl == 0):
for i in palin:
if (i != idx):
res.append([idx, i])
else:
for i in range(wl):
left,right = word[:i],word[i:] #left可能为空,right不可能为空
if (left == left[::-1] and right in pos and idx != pos[right]):
res.append([pos[right], idx])
if (right == right[::-1] and left in pos and idx != pos[left]):
res.append([idx, pos[left]])
return res
s = Solution()
print(s.palindromePairs(["a",""]))