• Palindrome Pairs 解答


    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"

     1 public class Solution {
     2     public List<List<Integer>> palindromePairs(String[] words) {
     3         List<List<Integer>> result = new ArrayList<>();
     4         if (words == null || words.length == 0) {
     5             return result;
     6         }
     7         // Record each string position
     8         Map<String, Integer> map = new HashMap<>();
     9         Set<Integer> palindromeSet = new HashSet<>();
    10         int len = words.length;
    11         for (int i = 0; i < len; i++) {
    12             map.put(words[i], i);
    13             if (isPalindrome(words[i])) {
    14                 palindromeSet.add(i);
    15             }
    16         }
    17         // Traverse
    18         for (int i = 0; i < len; i++) {
    19             String word = words[i];
    20             if (word.length() == 0) {
    21                 for (int index : palindromeSet) {
    22                     addResult(result, i, index);
    23                 }
    24             }
    25             int l = word.length();
    26             for (int j = 0; j < l; j++) {
    27                 String front = word.substring(0, j);
    28                 String back = word.substring(j, l);
    29                 String rFront = reverse(front);
    30                 String rBack = reverse(back);
    31                 if (isPalindrome(front) && map.containsKey(rBack)) {
    32                     addResult(result, map.get(rBack), i);
    33                 }
    34                 if (isPalindrome(back) && map.containsKey(rFront)) {
    35                     addResult(result, i, map.get(rFront));
    36                 }
    37             }
    38         }
    39         return result;
    40     }
    41     
    42     private String reverse(String s) {
    43         StringBuilder sb = new StringBuilder(s);
    44         return sb.reverse().toString();
    45     }
    46     
    47     private void addResult(List<List<Integer>> result, int start, int end) {
    48         if (start == end) {
    49             return;
    50         }
    51         List<Integer> indexes = new ArrayList<>();
    52         indexes.add(start);
    53         indexes.add(end);
    54         result.add(indexes);
    55     }
    56     
    57     private boolean isPalindrome(String s) {
    58         int i = 0;
    59         int j = s.length() - 1;
    60         while (i < j) {
    61             if (s.charAt(i) != s.charAt(j)) {
    62                 return false;
    63             }
    64             i++;
    65             j--;
    66         }
    67         return true;
    68     }
    69 }
  • 相关阅读:
    嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
    嵌入式Linux驱动开发之helloword心得
    PJMEDIA之录音器的使用(capture sound to avi file)
    PJMEID学习之视频的捕捉与播放
    PJSIP-PJMEDIA【使用pjmedia 播放wav格式的音乐】
    PJSIP-PJLIB-Socket
    PJSIP-PJLIB(samples) (the usage of the pjlib lib) (eg:string/I/O)
    Start with PJSIP on windows
    Android实际开发之网络请求组件的封装(OkHttp为核心)
    Android实际开发中的首页框架搭建(二、首页框架实现)
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/6018553.html
Copyright © 2020-2023  润新知