Question

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

Answer

Brute-force的做法是两层for循环,遍历每个string,看有无string可以与之匹配为palindrome。

较好的做法是利用HashMap。

对于String a来说,考虑两种情况:

1. a为空,则a与集合中任意已经对称的string可以组成结果

2. a不为空。

则有三种情况:

a. reverse(a)在集合中

b. a[0..i]对称,且reverse(a[i + 1,...,n])在集合中。如"aaabc", "cba"

c. a[i,..,n]对称,且reverse(a[0,...,i])在集合中。如"abcc", "ba"

 public class Solution {
public List<List<Integer>> palindromePairs(String[] words) {
List<List<Integer>> result = new ArrayList<>();
if (words == null || words.length == 0) {
return result;
}
// Record each string position
Map<String, Integer> map = new HashMap<>();
Set<Integer> palindromeSet = new HashSet<>();
int len = words.length;
for (int i = 0; i < len; i++) {
map.put(words[i], i);
if (isPalindrome(words[i])) {
palindromeSet.add(i);
}
}
// Traverse
for (int i = 0; i < len; i++) {
String word = words[i];
if (word.length() == 0) {
for (int index : palindromeSet) {
addResult(result, i, index);
}
}
int l = word.length();
for (int j = 0; j < l; j++) {
String front = word.substring(0, j);
String back = word.substring(j, l);
String rFront = reverse(front);
String rBack = reverse(back);
if (isPalindrome(front) && map.containsKey(rBack)) {
addResult(result, map.get(rBack), i);
}
if (isPalindrome(back) && map.containsKey(rFront)) {
addResult(result, i, map.get(rFront));
}
}
}
return result;
} private String reverse(String s) {
StringBuilder sb = new StringBuilder(s);
return sb.reverse().toString();
} private void addResult(List<List<Integer>> result, int start, int end) {
if (start == end) {
return;
}
List<Integer> indexes = new ArrayList<>();
indexes.add(start);
indexes.add(end);
result.add(indexes);
} private boolean isPalindrome(String s) {
int i = 0;
int j = s.length() - 1;
while (i < j) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
i++;
j--;
}
return true;
}
}

Palindrome Pairs 解答的更多相关文章

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

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

  2. LeetCode 336. Palindrome Pairs

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

  3. 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 ...

  4. 【题解】Palindrome pairs [Codeforces159D]

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

  5. leetcode 132 Palindrome Pairs 2

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

  6. leetcode 131 Palindrome Pairs

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

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

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

  8. [LeetCode] Palindrome Pairs 回文对

    Given a list of unique words. Find all pairs of distinct indices (i, j) in the given list, so that t ...

  9. 【LeetCode】Palindrome Pairs(336)

    1. Description Given a list of unique words. Find all pairs of distinct indices (i, j) in the given ...

随机推荐

  1. codeforces 148D之概率DP

    http://codeforces.com/problemset/problem/148/D D. Bag of mice time limit per test 2 seconds memory l ...

  2. uva 10555 - Dead Fraction)(数论)

    option=com_onlinejudge&Itemid=8&category=516&page=show_problem&problem=1496" st ...

  3. [Android Webkit]JNI基础及Java层与C++层的交互

    1. JNI 注册 1.1. JNI的基础结构       JAVA == JNI == Native Code      JNI(Java Native Interface)是Java与Native ...

  4. android PreferenceScreen使用笔记

    preference.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen ...

  5. ant打包命令

    学习ant打包命令.发布到以上tomcat还未做集成部署,无法添加到jenkins中. http://blog.csdn.net/telnetor/article/details/7015935 ht ...

  6. AJAX校验用户名是否存在,焦点离开用户名、点击 【 检 查用户名 】的校验。分别用 XMLHttp 和 JQueryAJAX实现。

     XMLHttp方法: $("#name").blur(function () { var xmlhttp = new ActiveXObject("Microsoft. ...

  7. android:http下载文件并保存到本地或SD卡

    想把文件保存到SD卡中,一定要知道SD卡的路径,获取SD卡路径: Environment.getExternalStorageDirectory() 另外,在保存之前要判断SD卡是否已经安装好,并且可 ...

  8. Windows8 正式版最简单的去除桌面水印方法

    方法一: 优点:无需替换文件,无需任何工具,对系统没有副作用缺点:更换主题或者壁纸之后水印再现方法:按住 “win键+P” 进入 “第二屏幕 ”选择 “扩展”再按住 “win键+P” 进入 “第二屏幕 ...

  9. Entity Framework 的事务

    一个db.SaveChanges()相当于一个事务,多个db.SaveChanges()保证操作完整性则需要使用事务 在Entity Framework 中使用事务,事务只会对数据库操作进行回滚,不会 ...

  10. Skin++ 皮肤库 CCheckListBox MFC 界面风格

    今天使用CCheckListBox,发现增加进去的字符串无法显示,但是当点击的时候,确有反应. 仔细检查代码,没有问题.之前也是这样用的,完全没有问题. 思前想后,觉得是因为使用了Skin++皮肤库, ...