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

Approach #1: C++.

class Solution {
public:
vector<vector<int>> palindromePairs(vector<string>& words) {
int size = words.size();
int mul = 1000000007; int max_len = 0;
vector<vector<int>> hash_pre(size, vector<int>());
vector<vector<int>> hash_suf(size, vector<int>()); vector<int> temp(2, 0);
vector<vector<int>> ret; for (int i = 0; i < size; ++i) {
hash_pre[i] = vector<int>(words[i].size(), 0);
hash_suf[i] = vector<int>(words[i].size(), 0); if (words[i].size() == 0) continue;
hash_pre[i][0] = words[i][0];
hash_suf[i][words[i].size()-1] = words[i][words[i].size()-1];
for (int j = 1; j < words[i].size(); ++j) {
hash_pre[i][j] = hash_pre[i][j-1] * mul + words[i][j];
}
for (int j = (int)words[i].size()-2; j >= 0; --j) {
hash_suf[i][j] = hash_suf[i][j+1] * mul + words[i][j];
}
max_len = max(max_len, (int)words[i].size());
} vector<int> exp(max_len + 1, 0);
exp[0] = 1;
for (int i = 1; i <= max_len; ++i)
exp[i] = exp[i-1] * mul;
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j) {
if (i == j) continue;
int len = words[i].size() + words[j].size();
int hash_left = 0, hash_right = 0;
int left_len = len / 2; if (left_len != 0) {
if (words[i].size() >= left_len) {
hash_left = hash_pre[i][left_len-1];
} else {
if (words[i].size() == 0)
hash_left = hash_pre[j][left_len-1];
else {
int right_pre = left_len - words[i].size();
hash_left = hash_pre[i][words[i].size() - 1] * exp[right_pre] + hash_pre[j][right_pre-1];
}
}
} if (left_len != 0) {
if (words[j].size() >= left_len) {
hash_right = hash_suf[j][words[j].size()-left_len];
} else {
if (words[j].size() == 0)
hash_right = hash_suf[i][words[i].size()-left_len];
else {
int left_pre = left_len - words[j].size();
hash_right = hash_suf[j][0] * exp[left_pre] + hash_suf[i][words[i].size()-left_pre];
}
}
} if (hash_left == hash_right) {
temp[0] = i, temp[1] = j;
ret.push_back(temp);
} }
return ret;
}
};

Runtime: 816 ms, faster than 3.13% of C++ online submissions for Palindrome Pairs.

Approach #2: Java.

class Solution {
public List<List<Integer>> palindromePairs(String[] words) {
Map<String, Integer> index = new HashMap<>();
Map<String, Integer> revIndex = new HashMap<>();
String[] revWords = new String[words.length];
for (int i = 0; i < words.length; ++i) {
String s = words[i];
String r = new StringBuilder(s).reverse().toString();
index.put(s, i);
revIndex.put(r, i);
revWords[i] = r;
}
List<List<Integer>> result = new ArrayList<>();
result.addAll(findPairs(words, revWords, revIndex, false));
result.addAll(findPairs(revWords, words, index, true));
return result;
} private static List<List<Integer>> findPairs(String[] words, String[] revWords, Map<String, Integer> revIndex, boolean reverse) {
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < words.length; ++i) {
String s = words[i];
for (int k = reverse ? 1 : 0; k <= s.length(); ++k) {
Integer j = revIndex.get(s.substring(k));
if (j != null && j != i) {
if (s.regionMatches(0, revWords[i], s.length() - k, k)) {
result.add(reverse ? Arrays.asList(i, j) : Arrays.asList(j, i));
}
}
}
}
return result;
}
}

  

Approach #3: Python.

class Solution(object):
def palindromePairs(self, words):
"""
:type words: List[str]
:rtype: List[List[int]]
"""
wordict = {}
res = []
for i in range(len(words)):
wordict[words[i]] = i
for i in range(len(words)):
for j in range(len(words[i])+1):
tmp1 = words[i][:j]
tmp2 = words[i][j:]
if tmp1[::-1] in wordict and wordict[tmp1[::-1]] != i and tmp2 == tmp2[::-1]:
res.append([i, wordict[tmp1[::-1]]])
if j != 0 and tmp2[::-1] in wordict and wordict[tmp2[::-1]] != i and tmp1 == tmp1[::-1]:
res.append([wordict[tmp2[::-1]], i]) return res

  

Time Submitted Status Runtime Language
a few seconds ago Accepted 144 ms java
27 minutes ago Accepted 864 ms python
3 hours ago Accepted 816 ms cpp

336. Palindrome Pairs(can't understand)的更多相关文章

  1. LeetCode 336. Palindrome Pairs

    原题链接在这里:https://leetcode.com/problems/palindrome-pairs/ 题目: Given a list of unique words, find all p ...

  2. 【LeetCode】336. Palindrome Pairs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...

  3. leetcode@ [336] Palindrome Pairs (HashMap)

    https://leetcode.com/problems/palindrome-pairs/ Given a list of unique words. Find all pairs of dist ...

  4. 336 Palindrome Pairs 回文对

    给定一组独特的单词, 找出在给定列表中不同 的索引对(i, j),使得关联的两个单词,例如:words[i] + words[j]形成回文.示例 1:给定 words = ["bat&quo ...

  5. 【leetcode】336. Palindrome Pairs

    题目如下: 解题思路:对于任意一个word,要找出在wordlist中是否存在与之能组成回文的其他words,有两种思路.一是遍历wordlist:二是对word本身进行分析,找出能组成回文的word ...

  6. DP VK Cup 2012 Qualification Round D. Palindrome pairs

    题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 /* 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 ...

  7. 【题解】Palindrome pairs [Codeforces159D]

    [题解]Palindrome pairs [Codeforces159D] 传送门:\(Palindrome\) \(pairs\) \([CF159D]\) [题目描述] 给定一个长度为 \(N\) ...

  8. leetcode 132 Palindrome Pairs 2

    lc132 Palindrome Pairs 2 大致与lc131相同,这里要求的是最小分割方案 同样可以分割成子问题 dp[i][j]还是表示s(i~j)是否为palindrome res[i]则用 ...

  9. leetcode 131 Palindrome Pairs

    lc131 Palindrome Pairs 解法1: 递归 观察题目,要求,将原字符串拆成若干子串,且这些子串本身都为Palindrome 那么挑选cut的位置就很有意思,后一次cut可以建立在前一 ...

随机推荐

  1. 使用Apache Commons Chain(转载)

    原博客出处:http://phil-xzh.iteye.com/blog/321536 使用Commons Chain 作为程序开发人员,我们经常需要对一个实际上程序性的系统应用面向对象的方法.商业分 ...

  2. EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551,John是EasyPusher安卓直播推流.EasyPlayer直播流媒体播放端的开发和维护者 ...

  3. EasyDarwin实现RTSP播放动态认证的两种方式:Basic/Digest & Token

    问题描述 目前为了能够方便开发者,我们将EasyDarwin中的RTSP认证过程直接忽略过了,如果要开启认证的方式,我们可以在代码中打开: case kRoutingRequest: { // Inv ...

  4. 不懂不能装懂--邮箱后缀“inc”的含义

    之前实习的公司,邮箱域名是XXX@XXX-inc.com 再之前,投递简历了或者关注某个公司的一些信息或者和这些公司的人邮件联系是也发现有这个inc的后缀,一直不明白,今天觉得自己找到答案了,不怕丢人 ...

  5. JQuery的extend

    jQuery.extend 函数详解 JQuery的extend扩展方法:      Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解 ...

  6. tomcat正常启动,但是java项目没有启动原因

    右键项目,选择properties,查看该属性配置的是否正确

  7. html5--5-7 绘制圆/弧

    html5--5-7 绘制圆/弧 学习要点 掌握arc() 方法创建圆弧/曲线(用于创建圆或部分圆) 矩形的绘制方法 rect(x,y,w,h)创建一个矩形 strokeRect(x,y,w,hx,y ...

  8. rkhunter和chkrootkit

    今天继续检查我的Linux,所以下来rkhunter和chkrootkit一个一个来,下面只记录命令,少些说明不截图了. 1.rkhunter #cd /temp #wget http://downl ...

  9. BZOJ_2901_矩阵求和_前缀和

    BZOJ_2901_矩阵求和_前缀和 Description 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. Input 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一 ...

  10. C++之STL迭代器

    迭代器是一种检查容器内元素并遍历元素的数据类型.可以替代下标访问vector对象的元素. 每种容器类型都定义了自己的迭代器类型,如 vector: vector<int>::iterato ...