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 ...
随机推荐
- OSI七层协议
- 22.allegro中PCB打印设置[原创]
1. -- 2. 3. 4. ----
- POJ 2409 Let it Bead(polay计数)
题目链接:http://poj.org/problem?id=2409 题意:给出一个长度为m的项链,每个珠子可以用n种颜色涂色.翻转和旋转后相同的算作一种.有多少种不同的项链? 思路: (1) 对于 ...
- Android app Splash页的替代方案
一般的App想要显示公司的log什么的,都会在启动的第一个页面显示,就是SplashActivity. 目前在看到一个替代SplashActivity的方案. 使用SplashActivity的时候, ...
- eclipse教程
http://www.eclipse.org/downloads/eclipse-packages/http://wiki.eclipse.org/Eclipse_Articles,_Tutorial ...
- sscanf() 和 sprintf()的用法。
因为感觉比较有用. 这几次比赛,用过几次,所以写个程序,总结一下. 如果用sscanf(s, "%d.%d", &a, &b); 的时候,一定要注意是否s里一定有小 ...
- 命名空间“System.Web”中不存在类型或命名空间名称“Script”(是缺少程序集引用吗?)
网上有些资料说,在项目上鼠标右键,添加引用→.Net→System.Web.Entensions就可以了. 实际上很多时候在项目中的添加引用窗口上,根本找不到System.Web.Entensions ...
- CSS强制英文换行
1. word-break:break-all;只对英文起作用,以字母作为换行依据 2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据 3. white-space: ...
- 待实践三:MVC3下 路由的测试 使用 RouteDebug.dll 来测试判断路由是否符合
在需要进行测试路由是否匹配的项目中引用 RouteDebug.dll 并且在MVC的Global.asax里面加入一段代码 //下面这行代码一定是在 RegisterRoutes(Rou ...
- snv的绑定,检出,同步
svn安装 http://www.android100.org/html/201511/15/196792.html svn绑定Studio 显示svn图标 效果图