【LeetCode】336. Palindrome Pairs 解题报告(Python)
作者: 负雪明烛
 id: fuxuemingzhu
 个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/palindrome-pairs/description/
题目描述
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"]
题目大意
如果从input进来的字符串中选取两个拼接在一起能构成回文字符串,那么就把这两个的索引加入到结果中。返回所有的索引列表。
解题方法
HashTable
这个题暴力求解会超时,优秀的解法还真不是容易想出来。不愧是Hard题啊,这个也是我做的第600个题。我就照搬大神的解法了[LeetCode]Palindrome Pairs 。
O(k * n ^2)解法 其中k为单词个数,n为单词的长度:
利用字典wmap保存单词 -> 下标的键值对
遍历单词列表words,记当前单词为word,下标为idx:
1). 若当前单词word本身为回文,且words中存在空串,则将空串下标bidx与idx加入答案
2). 若当前单词的逆序串在words中,则将逆序串下标ridx与idx加入答案
3). 将当前单词word拆分为左右两半left,right。
     3.1) 若left为回文,并且right的逆序串在words中,则将right的逆序串下标rridx与idx加入答案
     3.2) 若right为回文,并且left的逆序串在words中,则将left的逆序串下标idx与rlidx加入答案
时间复杂度是O(k * n ^2),空间复杂度是O(kN).
class Solution(object):
    def palindromePairs(self, words):
        """
        :type words: List[str]
        :rtype: List[List[int]]
        """
        wmap = {w : i for i, w in enumerate(words)}
        def isPalindrome(word):
            _len = len(word)
            for x in range(_len / 2):
                if word[x] != word[_len - x - 1]:
                    return False
            return True
        res = set()
        for idx, word in enumerate(words):
            if word and isPalindrome(word) and "" in wmap:
                nidx = wmap[""]
                res.add((idx, nidx))
                res.add((nidx, idx))
            rword = word[::-1]
            if word and rword in wmap:
                nidx = wmap[rword]
                if idx != nidx:
                    res.add((idx, nidx))
                    res.add((nidx, 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:
                    res.add((wmap[rright], idx))
                if isPalindrome(right) and rleft in wmap:
                    res.add((idx, wmap[rleft]))
        return list(res)
相似题目
参考资料
http://bookshadow.com/weblog/2016/03/10/leetcode-palindrome-pairs/
日期
2018 年 11 月 1 日 —— 小光棍节
【LeetCode】336. Palindrome Pairs 解题报告(Python)的更多相关文章
- LeetCode 336. Palindrome Pairs
		原题链接在这里:https://leetcode.com/problems/palindrome-pairs/ 题目: Given a list of unique words, find all p ... 
- leetcode@ [336] Palindrome Pairs (HashMap)
		https://leetcode.com/problems/palindrome-pairs/ Given a list of unique words. Find all pairs of dist ... 
- 【LeetCode】Palindrome Partitioning 解题报告
		[题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ... 
- 【LeetCode】120. Triangle 解题报告(Python)
		[LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ... 
- LeetCode 1 Two Sum 解题报告
		LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ... 
- 【LeetCode】Permutations II 解题报告
		[题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ... 
- 【LeetCode】Island Perimeter 解题报告
		[LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ... 
- 【LeetCode】01 Matrix 解题报告
		[LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ... 
- 【LeetCode】Largest Number 解题报告
		[LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ... 
随机推荐
- 11.13python第一周周末练习
			2.请输出你的基本个人信息 3.结合逻辑判断,写一个不同学生分数,输出良好,优秀,分数不及格 循环输出 字符串的替换. 以什么开头startwith 以什么结尾endwith 列表转为字符串 字符串转 ... 
- typora 图床配置方法
			学习计算机的同学,在日常学习中难免会记笔记,写文档.相信大家记笔记大部分使用的都是 Markdown 吧,如果到现在还没接触,那我强烈建议你去学习一下,大概几分钟就可以搞定它. 注:下文用到的所有软件 ... 
- flink-----实时项目---day07-----1.Flink的checkpoint原理分析  2. 自定义两阶段提交sink(MySQL) 3 将数据写入Hbase(使用幂等性结合at least Once实现精确一次性语义)  4 ProtoBuf
			1.Flink中exactly once实现原理分析 生产者从kafka拉取数据以及消费者往kafka写数据都需要保证exactly once.目前flink中支持exactly once的sourc ... 
- 【Reverse】初遇花指令
			解密花指令 全文参考了一个大师傅的blog:https://blog.csdn.net/zhangmiaoping23/article/details/38400393 介绍 花指令是对抗反汇编的有效 ... 
- Siebel调用WebService
			Siebel可以调用外部系统的接口,通过WebService的接入方式实现,所在的项目都是通过ESB,其他系统的接口都要经过ESB,由ESB提供WSDL文档,通过Siebel调用. 一.修改Tools ... 
- Android 实现微信QQ分享以及第三方登录
			集成准备 在微信开放平台创建移动应用,输入应用的信息,包括移动应用名称,移动应用简介,移动应用图片信息,点击下一步,选择Android 应用,填写信息提交审核. 获取Appkey 集成[友盟+]SDK ... 
- Linux基础命令---apachectl
			apachectl apachectl指令是apache http服务器的前端控制程序,可以协助控制apache服务的守护进程httpd. 此命令的适用范围:RedHat.RHEL.Ubuntu.Ce ... 
- mybatis错误 Mapped Statements collection does not contain value for
			java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for 在unit里测试 ... 
- web端 - 返回上一步,点击返回,跳转上个页面 JS
			1.方法一: <script language="javascript" type="text/javascript"> window.locati ... 
- 使用fastDFS上传和下载图片文件
			package com.xuecheng.test.fastdfs;import org.csource.common.MyException;import org.csource.fastdfs.* ... 
