Leetcode 336. Palindrome Pairs

本文介绍了一种算法,用于从给定的唯一单词列表中找出所有可能的配对,使得两个单词的拼接形成回文。通过使用哈希表和巧妙地处理空字符串及自身回文的情况,有效地解决了重复问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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",""]))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值