336. 回文对

Hard

方法一(暴力)(TLE)

思路

首先想到了方式是暴力求解,遍历所有索引对,判断所有拼成的字是不是回文字。如果是的话,将索引对放到结果当中

尝试写一下代码,TLE

代码

python3

class Solution:
    def isPalindrome(self, word):
      i = 0
      j = len(word) - 1
      while i < j:
        if word[i] == word[j]:
          i += 1
          j -= 1
        else:
          return False
      return True

    def palindromePairs(self, words: List[str]) -> List[List[int]]:
      res = []
      for i in range(len(words)-1):
        for j in range(i+1, len(words)):
          if self.isPalindrome(words[i]+words[j]):
            res.append([i,j])
          if self.isPalindrome(words[j]+words[i]):
            res.append([j,i])
      return res

方法二(哈希表)

思路

优化以上代码,我们可以从单词拆分的角度出发。

尝试写一下代码,AC!

代码

python3

class Solution:
    def isPalindrome(self, w):
      i, j = 0, len(w)-1
      while i < j:
        if w[i] == w[j]:
          i += 1
          j -= 1
        else:
          return False
      return True

    def palindromePairs(self, words: List[str]) -> List[List[int]]:
      res = []
      rs = {}
      for i,w in enumerate(words):
        rs[w[::-1]] = i
      for k,w in enumerate(words):
        for i in range(len(w)+1):
          w1 = w[:i]
          w2 = w[i:]
          if self.isPalindrome(w1) and w2 in rs and rs[w2] != k:
            res.append([rs[w2],k])
          if self.isPalindrome(w2) and w1 in rs and rs[w1] != k:
            res.append([k,rs[w1]])
      return list(set([tuple(x) for x in res]))