Skip to content

336. Palindrome Pairs

Problem:

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

Solutions:

public class Solution {
    public List<List<Integer>> palindromePairs(String[] words) {
        HashMap<String, Integer> index = new HashMap<String, Integer>();
        for (int i = 0; i < words.length; i ++) {
            index.put(words[i], i);
        }
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        for (int i = 0; i < words.length; i ++) {
            String reverse = new StringBuilder(words[i]).reverse().toString();
            int start = 0, end = reverse.length();
            if (index.containsKey(reverse) && index.get(reverse) != i) {
                List<Integer> tmp = new LinkedList<Integer>();
                tmp.add(index.get(reverse));
                tmp.add(i);
                res.add(tmp);
                start ++;
                end --;
            }

            for (int j = start; j <= end; j ++) {
                String left = reverse.substring(0, j);
                String right = reverse.substring(j);
                if (index.containsKey(left) && index.get(left) != i && isPa(right)) {
                    List<Integer> tmp = new LinkedList<Integer>();
                    tmp.add(index.get(left));
                    tmp.add(i);
                    res.add(tmp);
                }
                if (index.containsKey(right) && index.get(right) != i && isPa(left)) {
                    List<Integer> tmp = new LinkedList<Integer>();
                    tmp.add(i);
                    tmp.add(index.get(right));
                    res.add(tmp);
                }
            }
        }
        return res;
    }
    private boolean isPa(String s) {
        if (s.equals("")) {
            return true;
        }
        int left = 0, right = s.length() - 1;
        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left ++;
            right --;
        }
        return true;
    }
}