给定一组 互不相同 的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
示例 1:
输入:[“abcd”,“dcba”,“lls”,“s”,“sssll”]
输出:[[0,1],[1,0],[3,2],[2,4]]
解释:可拼接成的回文串为 [“dcbaabcd”,“abcddcba”,“slls”,“llssssll”]
代码
class Solution {class node{int[] next=new int[26];int flag;public node(){flag=-1;}}ArrayList<node> tree=new ArrayList<>();public void insert(String s,int id){int n=s.length(),cur=0;for(int i=0;i<n;i++){int t=s.charAt(i)-'a';if(tree.get(cur).next[t]==0)//不存在就新建{tree.add(new node());tree.get(cur).next[t]=tree.size()-1;}cur=tree.get(cur).next[t];//迭代}tree.get(cur).flag=id;//给最后一个字符加上id}public int search(String s,int l,int r){int cur=0;for(int i=r;i>=l;i--){int t=s.charAt(i)-'a';if(tree.get(cur).next[t]==0)//找不到return -1;cur=tree.get(cur).next[t];}return tree.get(cur).flag;//返回字符串结尾的标志}public boolean isPa(String s,int l,int r)//判断回文串{int len=r-l+1;for(int i=0;i<len/2;i++){if(s.charAt(l+i)!=s.charAt(r-i))return false;}return true;}public List<List<Integer>> palindromePairs(String[] words) {tree.add(new node());List<List<Integer>> res=new ArrayList<>();int n=words.length;for(int i=0;i<n;i++)insert(words[i],i);for(int i=0;i<n;i++){int m=words[i].length();for(int j=0;j<=m;j++)//搜索符合条件的字符串{if(isPa(words[i],j,m-1))//字符串的右部分回文,需要补上与左部分对称的回文字符串{int fl=search(words[i],0,j-1);if(fl!=-1&&fl!=i)//找到了符合的字符串{res.add(Arrays.asList(i,fl));}}if(j>0&&isPa(words[i],0,j-1)){int fr=search(words[i],j,m-1);if(fr!=-1&&fr!=i){res.add(Arrays.asList(fr,i));}}}}return res;}
}