# 回文对

给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。

 

示例 1:

输入:words = ["abcd","dcba","lls","s","sssll"]
输出:[[0,1],[1,0],[3,2],[2,4]] 
解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]

示例 2:

输入:words = ["bat","tab","cat"]
输出:[[0,1],[1,0]] 
解释:可拼接成的回文串为 ["battab","tabbat"]

示例 3:

输入:words = ["a",""]
输出:[[0,1],[1,0]]
 

提示:

## template ```java class Solution { private static List> ans = new ArrayList<>(); public List> palindromePairs(String[] words) { if (words == null || words.length == 0) { return null; } ans = new ArrayList<>(); TrieNode root = new TrieNode(); for (int i = 0; i < words.length; i++) { addWord(root, words[i], i); } for (int i = 0; i < words.length; i++) { find(root, words[i], i); } return ans; } private static class TrieNode { int index; TrieNode[] next; List palindIndex; public TrieNode() { index = -1; next = new TrieNode[26]; palindIndex = new ArrayList<>(); } } private static void addWord(TrieNode root, String word, int index) { for (int i = word.length() - 1; i >= 0; i--) { int ch = word.charAt(i) - 'a'; if (root.next[ch] == null) { root.next[ch] = new TrieNode(); } if (isPalindrome(word, 0, i)) { root.palindIndex.add(index); } root = root.next[ch]; } root.index = index; root.palindIndex.add(index); } private static void find(TrieNode root, String word, int index) { for (int i = 0; i < word.length(); i++) { if (root.index != -1 && root.index != index && isPalindrome(word, i, word.length() - 1)) { ans.add(Arrays.asList(index, root.index)); } if (root.next[word.charAt(i) - 'a'] == null) { return; } root = root.next[word.charAt(i) - 'a']; } for (int i : root.palindIndex) { if (i != index) { ans.add(Arrays.asList(index, i)); } } } private static boolean isPalindrome(String string, int l, int r) { while (l < r) { if (string.charAt(l++) != string.charAt(r--)) { return false; } } return true; } } ``` ## 答案 ```java ``` ## 选项 ### A ```java ``` ### B ```java ``` ### C ```java ```