Palindrome Pairs
Given a list of unique words. Find all pairs of 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:
Given words
= ["bat", "tab", "cat"]
Return [[0, 1], [1, 0]]
The palindromes are ["battab", "tabbat"]
Example 2:
Given words
= ["abcd", "dcba", "lls", "s", "sssll"]
Return [[0, 1], [1, 0], [3, 2], [2, 4]]
The palindromes are ["dcbaabcd", "abcddcba", "slls", "llssssll"]
这个是一种思考思路:
本来自己是写的C++版本,思考方向是挨个配对判断,奈何目前停留在运行错误阶段,,http://bookshadow.com/weblog/357/这个给出了python的解法:
class Solution(object):
def palindromePairs(self, words):
"""
:type words: List[str]
:rtype: List[List[int]]
"""
wmap = {y : x for x, y in enumerate(words)}
def isPalindrome(word):
size = len(word)
for x in range(size / 2):
if word[x] != word[size - x - 1]:
return False
return True
ans = set()
for idx, word in enumerate(words):
if "" in wmap and word != "" and isPalindrome(word):
bidx = wmap[""]
ans.add((bidx, idx))
ans.add((idx, bidx))
rword = word[::-1]
if rword in wmap:
ridx = wmap[rword]
if idx != ridx:
ans.add((idx, ridx))
ans.add((ridx, idx))
for x in range(1, len(word)):
left, right = word[:x], word[x:]
rleft, rright = left[::-1], right[::-1]
if isPalindrome(left) and rright in wmap:
ans.add((wmap[rright], idx))
if isPalindrome(right) and rleft in wmap:
ans.add((idx, wmap[rleft]))
return list(ans)
c++留待继续改正。