Given a list of unique words, return all the pairs of the distinct indices (i, j) in the given list, so that the concatenation of the two words words[i] + words[j] is a palindrome.
Example 1:
**Input:** words = ["abcd","dcba","lls","s","sssll"]
**Output:** [[0,1],[1,0],[3,2],[2,4]]
**Explanation:** The palindromes are ["dcbaabcd","abcddcba","slls","llssssll"]
Example 2:
**Input:** words = ["bat","tab","cat"]
**Output:** [[0,1],[1,0]]
**Explanation:** The palindromes are ["battab","tabbat"]
Example 3:
**Input:** words = ["a",""]
**Output:** [[0,1],[1,0]]
Constraints:
1 <= words.length <= 5000
0 <= words[i].length <= 300
words[i] consists of lower-case English letters.
ac1: split word
one important idea in palindrome is cutting the string into 2 parts and check palindrome.
classSolution {publicList<List<Integer>> palindromePairs(String[] words) {List<List<Integer>> res =newArrayList<List<Integer>>();// edge casesif (words ==null||words.length<=1) return res;Map<String,Integer> map =newHashMap<>();for (int i =0; i <words.length; i++) {map.put(words[i], i); }for (int i =0; i <words.length; i++) {String curr = words[i];for (int j =0; j <=curr.length(); j++) {String left =curr.substring(0, j);String right =curr.substring(j);// check left sideif (isPalindrome(left)) { // left side is palindrome, check the restString rightReversed =newStringBuilder().append(right).reverse().toString();if (map.containsKey(rightReversed) &&map.get(rightReversed) != i) { // cannot be itself, like "a"res.add(Arrays.asList(map.get(rightReversed), i)); // found, append to the left } }// check right side if (right.length() != 0 && isPalindrome(right)) { // right.length() != 0 avoid duplicate, like "abc", when left is "", this has been processed.
String leftReversed =newStringBuilder().append(left).reverse().toString();if (map.containsKey(leftReversed)) {res.add(Arrays.asList(i,map.get(leftReversed))); // found, append to the right } } } }return res; }privatebooleanisPalindrome(String s) {int l =0, r =s.length() -1;while (l <= r) {if (s.charAt(l) !=s.charAt(r)) returnfalse; l++; r--; }returntrue; }}/*hashmap*/