美文网首页
Palindrome Pairs

Palindrome Pairs

作者: nafoahnaw | 来源:发表于2018-03-08 20:01 被阅读0次

    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 List<List<Integer>> palindromePairs(String[] words) {
            List<List<Integer>> result = new ArrayList<List<Integer>>();
            Map<String, Integer> wordMap = new HashMap<String, Integer>();
            for (int i = 0; i < words.length; i++) {
                wordMap.put(words[i], i);
            }
            /**
             * 两个字符串组合是否是回文的判断
             * 1.如果存在s1[0,i]是回文并且s1[i:].reverse() == s2,那么s2 + s1是回文
             * 2.如果存在s1[i:]是回文并且s1[0:i].reverse() == s2,那么s1 + s2是回文
             * 请这样理解,对于1来说,如果s1[0,i]是回文,我们可以把s[0,i]作为组合起来字符串的中间部分
             * 那么右边的部分是s1[i:],如果组合的字符串是回文的话,那么一定证明左边的部分==s1[i:].reverse()
             * 那么我们只需要在wordMap中找是否包含s1[i:].reverse()的字符即可
             * 对于2来说同理
             */
            for(int i = 0; i < words.length; i++){
                for(int j = 0; j <= words[i].length(); j++){
                    String str1 = words[i].substring(0, j);
                    String str2 = words[i].substring(j);
    
                    if(isPalindrome(str1)){
                        String str2reserve = new StringBuilder(str2).reverse().toString();
                        /**
                         * wordMap.get(str2reserve) != i 避免自己和自己判断
                         */
                        if(wordMap.containsKey(str2reserve) && wordMap.get(str2reserve) != i){
                            List<Integer> list = new ArrayList<Integer>();
                            list.add(wordMap.get(str2reserve));
                            list.add(i);
                            result.add(list);
                        }
                    }
                    //str2.length() != 0 的判断是由于str1==""的时候和str2==""的时候结果是一样的,
                    // 为了避免重复,str2==""的情况就不执行了
                    if(isPalindrome(str2) && str2.length() != 0){
                        String str1reserve = new StringBuilder(str1).reverse().toString();
                        if(wordMap.containsKey(str1reserve) && wordMap.get(str1reserve) != i){
                            List<Integer> list = new ArrayList<Integer>();
                            list.add(i);
                            list.add(wordMap.get(str1reserve));
                            result.add(list);
                        }
                    }
                }
            }
            return result;
        }
    
        private boolean isPalindrome(String str) {
            int left = 0;
            int right = str.length() - 1;
            while (left <= right) {
                if (str.charAt(left++) !=  str.charAt(right--)) {
                    return false;
                }
            }
            return true;
        }
    

    相关文章

      网友评论

          本文标题:Palindrome Pairs

          本文链接:https://www.haomeiwen.com/subject/cutufftx.html