Advertisement
ogv

Untitled

ogv
Oct 22nd, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.08 KB | None | 0 0
  1. // Runtime: 44 ms, faster than 74.91% of Java online submissions for Palindrome Pairs.
  2. // Memory Usage: 54 MB, less than 19.51% of Java online submissions for Palindrome Pairs.
  3. class Solution {
  4.     private char[][] w;
  5.     TrieNode trie = new TrieNode();
  6.        
  7.     public List<List<Integer>> palindromePairs(String[] words) {
  8.         w = new char[words.length][];
  9.         for (int i = 0; i < words.length; i++) w[i] = words[i].toCharArray();        
  10.        
  11.         for (int i = 0; i < w.length; i++) {
  12.             TrieNode node = trie;
  13.             for (int j = 0; j < w[i].length; j++) {
  14.                 if (isPali(i, j, w[i].length - 1)) node.words.add(i);            
  15.                 node = node.getNext(w[i][j]);  
  16.             }
  17.             node.words.add(i);
  18.             node.endWord = i;  
  19.         }
  20.        
  21.         List<List<Integer>> result = new ArrayList<List<Integer>>();
  22.        
  23.         for (int i = 0; i < w.length; i++) {
  24.             TrieNode node = trie;
  25.             for (int j = w[i].length - 1; j >= 0 && node != null; j--) {
  26.                 if (node.endWord != -1 && node.endWord != i && isPali(i, 0, j))
  27.                     result.add(Arrays.asList(node.endWord, i));
  28.                
  29.                 node = node.getNext(w[i][j]);
  30.             }
  31.             if (node == null) continue;
  32.            
  33.             for (int wordIndex: node.words)
  34.                 if (wordIndex != i) result.add(Arrays.asList(wordIndex, i));
  35.         }
  36.                
  37.         return result;
  38.     }
  39.    
  40.     private boolean isPali(int i, int l, int r) {
  41.         while (l < r)
  42.             if (w[i][l++] != w[i][r--]) return false;
  43.        
  44.         return true;
  45.     }
  46.    
  47.     class TrieNode {
  48.         public List<Integer> words = new ArrayList<>();
  49.         public TrieNode[] next= new TrieNode[26];
  50.         public int endWord = -1;
  51.        
  52.         public TrieNode getNext(char c) {
  53.             TrieNode n = next[c - 'a'];
  54.             if (n == null) {
  55.                 n = new TrieNode();
  56.                 next[c - 'a'] = n;
  57.             }
  58.             return n;
  59.         }
  60.     }  
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement