1 public class Solution {
 2     public List<List<Integer>> palindromePairs(String[] words) {
 3     List<List<Integer>> ret = new ArrayList<>(); 
 4     if (words == null || words.length < 2) return ret;
 5     Map<String, Integer> map = new HashMap<String, Integer>();
 6     for (int i=0; i<words.length; i++) map.put(words[i], i);
 7     for (int i=0; i<words.length; i++) {
 8         // System.out.println(words[i]);
 9         for (int j=0; j<=words[i].length(); j++) { // notice it should be "j <= words[i].length()"
10             String str1 = words[i].substring(0, j);
11             String str2 = words[i].substring(j);
12             if (isPalindrome(str1)) {
13                 String str2rvs = new StringBuilder(str2).reverse().toString();
14                 if (map.containsKey(str2rvs) && map.get(str2rvs) != i) {
15                     List<Integer> list = new ArrayList<Integer>();
16                     list.add(map.get(str2rvs));
17                     list.add(i);
18                     ret.add(list);
19                     // System.out.printf("isPal(str1): %s\n", list.toString());
20                 }
21             }
22             if (isPalindrome(str2)) {
23                 String str1rvs = new StringBuilder(str1).reverse().toString();
24                 // check "str.length() != 0" to avoid duplicates
25                 if (map.containsKey(str1rvs) && map.get(str1rvs) != i && str2.length()!=0) { 
26                     List<Integer> list = new ArrayList<Integer>();
27                     list.add(i);
28                     list.add(map.get(str1rvs));
29                     ret.add(list);
30                     // System.out.printf("isPal(str2): %s\n", list.toString());
31                 }
32             }
33         }
34     }
35     return ret;
36 }
37 
38 private boolean isPalindrome(String str) {
39     int left = 0;
40     int right = str.length() - 1;
41     while (left <= right) {
42         if (str.charAt(left++) !=  str.charAt(right--)) return false;
43     }
44     return true;
45 }
46 }

1. j can reach word[i].length() since it can form an empty string;

2. to aviod duplication ( empty string can cause two found for a pair ,ex [abcd, dbca])

posted on 2016-07-01 15:12  keepshuatishuati  阅读(180)  评论(0编辑  收藏  举报