力扣(LeetCode)( 回文对)Python3

题目:回文对

    给定一组 互不相同 的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。

示例 1:
    
    输入:["abcd","dcba","lls","s","sssll"]
    输出:[[0,1],[1,0],[3,2],[2,4]] 
    解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]
示例 2:

    输入:["bat","tab","cat"]
    输出:[[0,1],[1,0]] 
    解释:可拼接成的回文串为 ["battab","tabbat"]

解题思路:

        使用哈希表枚举前缀和后缀

代码:

        def findWord(s: str, left: int, right: int) -> int:
            return indices.get(s[left:right+1], -1)
        def isPalindrome(s: str, left: int, right: int) -> bool:
            return (sub := s[left:right+1]) == sub[::-1]
        n = len(words)
        indices = {word[::-1]: i for i, word in enumerate(words)}
        ret = list()
        for i, word in enumerate(words):
            m = len(word)
            for j in range(m + 1):
                if isPalindrome(word, j, m - 1):
                    leftId = findWord(word, 0, j - 1)
                    if leftId != -1 and leftId != i:
                        ret.append([i, leftId])
                if j and isPalindrome(word, 0, j - 1):
                    rightId = findWord(word, j, m - 1)
                    if rightId != -1 and rightId != i:
                        ret.append([rightId, i])
        return ret

结果:

题解参考:力扣官方题解 字典树哈希表字符串

猜你喜欢

转载自blog.csdn.net/adminkeys/article/details/107845214
今日推荐