leetcode@ [336] Palindrome Pairs (HashMap)
https://leetcode.com/problems/palindrome-pairs/
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:
Given words = ["bat", "tab", "cat"]
Return [[0, 1], [1, 0]]
The palindromes are ["battab", "tabbat"]
Example 2:
Given words = ["abcd", "dcba", "lls", "s", "sssll"]
Return [[0, 1], [1, 0], [3, 2], [2, 4]]
The palindromes are ["dcbaabcd", "abcddcba", "slls", "llssssll"]
public class Solution {
public static boolean isPalindrome(StringBuffer sb) {
if(sb == null || sb.length() == 0) return true;
int l = 0, r = sb.length()-1;
while(l < r) {
if(sb.charAt(l) != sb.charAt(r)) return false;
++l; --r;
}
return true;
}
public static void buildMappings(String[] words, HashMap<String, HashSet<String> > mapping) {
for(int i=0; i<words.length; ++i) {
StringBuffer sb = new StringBuffer(words[i]);
HashSet<String> adj = new HashSet<String> ();
for(int j=0; j<=sb.length(); ++j) {
/** partition words[i] into two parts */
StringBuffer prefix = new StringBuffer(sb.substring(0, j));
StringBuffer suffix = new StringBuffer(sb.substring(j));
/** check whether or not the prefix of words[i] is palindrome */
/** if it does, then the prefix can be the rotated point, otherwise not*/
if(isPalindrome(prefix)) {
/** adj stores the strings where suffix + words[i] is palindrome */
adj.add(suffix.reverse().toString());
}
if(isPalindrome(suffix)) {
/** adj stores the strings where words[i] + prefix is palindrome */
adj.add(prefix.reverse().toString());
}
}
/** add it to mapping */
mapping.put(sb.toString(), adj);
}
HashSet<String> hs = new HashSet<String> ();
for(int i=0; i<words.length; ++i) {
StringBuffer sb = new StringBuffer(words[i]);
if(isPalindrome(sb)) {
hs.add(sb.toString());
}
}
for(int i=0; i<words.length; ++i) {
if(words[i].equals("")) {
HashSet<String> adj = new HashSet<String> ();
adj.addAll(hs);
mapping.put(words[i], adj);
}
}
}
public List<List<Integer>> palindromePairs(String[] words) {
HashSet<List<Integer> > hres = new HashSet<List<Integer> > ();
List<List<Integer> > res = new ArrayList<List<Integer> > ();
HashMap<String, HashSet<String> > mapping = new HashMap<String, HashSet<String> > ();
buildMappings(words, mapping);
HashMap<String, Integer> dict = new HashMap<String, Integer> ();
for(int i=0; i<words.length; ++i) {
dict.put(words[i], i);
}
Iterator iter = mapping.entrySet().iterator();
while(iter.hasNext()) {
HashMap.Entry entry = (HashMap.Entry) iter.next();
String str = (String) entry.getKey();
int lpos = dict.get(str);
//System.out.print(str + " ==> ");
HashSet<String> hs = (HashSet<String>) entry.getValue();
Iterator<String> itc = hs.iterator();
while(itc.hasNext()) {
String s = itc.next();
//System.out.print(s + " ");
if(dict.containsKey(s)) {
int rpos = dict.get(s);
if(lpos != rpos) {
StringBuffer sb1 = new StringBuffer(str).append(s);
if(isPalindrome(sb1)) {
List<Integer> ll = new ArrayList<Integer> ();
ll.add(lpos);
ll.add(rpos);
hres.add(ll);
}
StringBuffer sb2 = new StringBuffer(s).append(str);
if(isPalindrome(sb2)) {
List<Integer> ll2 = new ArrayList<Integer> ();
ll2.add(rpos);
ll2.add(lpos);
hres.add(ll2);
}
}
}
}//System.out.println();
}
res.addAll(hres);
return res;
}
}
leetcode@ [336] Palindrome Pairs (HashMap)的更多相关文章
- LeetCode 336. Palindrome Pairs
原题链接在这里:https://leetcode.com/problems/palindrome-pairs/ 题目: Given a list of unique words, find all p ...
- 【LeetCode】336. Palindrome Pairs 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...
- 336. Palindrome Pairs(can't understand)
Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that t ...
- leetcode 132 Palindrome Pairs 2
lc132 Palindrome Pairs 2 大致与lc131相同,这里要求的是最小分割方案 同样可以分割成子问题 dp[i][j]还是表示s(i~j)是否为palindrome res[i]则用 ...
- leetcode 131 Palindrome Pairs
lc131 Palindrome Pairs 解法1: 递归 观察题目,要求,将原字符串拆成若干子串,且这些子串本身都为Palindrome 那么挑选cut的位置就很有意思,后一次cut可以建立在前一 ...
- 【LeetCode】Palindrome Pairs(336)
1. Description Given a list of unique words. Find all pairs of distinct indices (i, j) in the given ...
- 【leetcode】336. Palindrome Pairs
题目如下: 解题思路:对于任意一个word,要找出在wordlist中是否存在与之能组成回文的其他words,有两种思路.一是遍历wordlist:二是对word本身进行分析,找出能组成回文的word ...
- [Leetcode] 336. Palindrome Pairs_Hard
Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that t ...
- 336 Palindrome Pairs 回文对
给定一组独特的单词, 找出在给定列表中不同 的索引对(i, j),使得关联的两个单词,例如:words[i] + words[j]形成回文.示例 1:给定 words = ["bat&quo ...
随机推荐
- Atheros AR9485 ubuntu 10.04 驱动安装及networking disable问题解决
Laptop: ACER Aspire 5733-6629 Wireless:Lite-on HB125, CHIPS: Atheros AR9485 Ubuntu: 10.04LTS (2.6.32 ...
- 【POJ】2170 Lattice Animals
1. 题目描述给定$n \times m, n.m \in [1, 10]$的方格,求不同形状的$[1 \cdots 10]$联通块的个数?所谓不同形状,表示不能通过平移.旋转.镜像实现相同的形状.2 ...
- Java 基础之认识 Annotation
Java 基础之认识 Annotation 从 JDK 1.5 版本开始,Java 语言提供了通用的 Annotation 功能,允许开发者定义和使用自己的 Annotation 类型.Annotat ...
- poj 3258 River Hopscotch(二分+贪心)
题目:http://poj.org/problem?id=3258 题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都 ...
- UVa 580 (递推) Critical Mass
题意: 有两种盒子分别装有铀(U)和铅(L),现在把n个盒子排成一列(两种盒子均足够多),而且要求至少有3个铀放在一起,问有多少种排放方法. 分析: n个盒子排成一列,共有2n中方案,设其中符合要求的 ...
- UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
这个题能1A纯属运气,要是WA掉,可真不知道该怎么去调了. 题意: 这是完全独立的6个子问题.代码中是根据字符串的长度来区分问题编号的. 给出三角形三点坐标,求外接圆圆心和半径. 给出三角形三点坐标, ...
- ASP.NET缓存OutputCache和Response.Cache之C#后台设置
一.ASPX页面缓存页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明<%@ OutputCache Duration="60" VaryByParam=&qu ...
- 转:MVC3系列:~Html.BeginForm与Ajax.BeginForm
Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...
- 自定义View等待旋转
效果图 1 string.xml <string name="default_progressbar">Default Progressbar:</string& ...
- Java Web编程的主要组件技术——Struts的高级功能
参考书籍:<J2EE开源编程精要15讲> Struts对国际化的支持 "国际化"(I18N)指一个应用程序在运行时能根据客户端请求所来的国家/地区.语言的不同显示不同的 ...