LeetCode 0336. Palindrome Pairs Solution in Java, Python, C++, JavaScript, Go & Rust | Explanation + Code

CoderIndeed
0
0336. Palindrome Pairs

Description

You are given a 0-indexed array of unique strings words.

A palindrome pair is a pair of integers (i, j) such that:

  • 0 <= i, j < words.length,
  • i != j, and
  • words[i] + words[j] (the concatenation of the two strings) is a palindrome.

Return an array of all the palindrome pairs of words.

You must write an algorithm with O(sum of words[i].length) runtime complexity.

 

Example 1:

Input: words = ["abcd","dcba","lls","s","sssll"]
Output: [[0,1],[1,0],[3,2],[2,4]]
Explanation: The palindromes are ["abcddcba","dcbaabcd","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]]
Explanation: The palindromes are ["a","a"]

 

Constraints:

  • 1 <= words.length <= 5000
  • 0 <= words[i].length <= 300
  • words[i] consists of lowercase English letters.

Solutions

Solution 1

PythonJavaGoC#
class Solution: def palindromePairs(self, words: List[str]) -> List[List[int]]: d = {w: i for i, w in enumerate(words)} ans = [] for i, w in enumerate(words): for j in range(len(w) + 1): a, b = w[:j], w[j:] ra, rb = a[::-1], b[::-1] if ra in d and d[ra] != i and b == rb: ans.append([i, d[ra]]) if j and rb in d and d[rb] != i and a == ra: ans.append([d[rb], i]) return ans(code-box)

Solution 2

Java
class Trie { Trie[] children = new Trie[26]; Integer v; void insert(String w, int i) { Trie node = this; for (char c : w.toCharArray()) { c -= 'a'; if (node.children[c] == null) { node.children[c] = new Trie(); } node = node.children[c]; } node.v = i; } Integer search(String w, int i, int j) { Trie node = this; for (int k = j; k >= i; --k) { int idx = w.charAt(k) - 'a'; if (node.children[idx] == null) { return null; } node = node.children[idx]; } return node.v; } } class Solution { public List<List<Integer>> palindromePairs(String[] words) { Trie trie = new Trie(); int n = words.length; for (int i = 0; i < n; ++i) { trie.insert(words[i], i); } List<List<Integer>> ans = new ArrayList<>(); for (int i = 0; i < n; ++i) { String w = words[i]; int m = w.length(); for (int j = 0; j <= m; ++j) { if (isPalindrome(w, j, m - 1)) { Integer k = trie.search(w, 0, j - 1); if (k != null && k != i) { ans.add(Arrays.asList(i, k)); } } if (j != 0 && isPalindrome(w, 0, j - 1)) { Integer k = trie.search(w, j, m - 1); if (k != null && k != i) { ans.add(Arrays.asList(k, i)); } } } } return ans; } // TLE // private boolean isPalindrome(String w, int i, int j) { // for (; i < j; ++i, --j) { // if (w.charAt(i) != w.charAt(j)) { // return false; // } // } // return true; // } private boolean isPalindrome(String w, int start, int end) { int i = start, j = end; for (; i < j; ++i, --j) { if (w.charAt(i) != w.charAt(j)) { return false; } } return true; } }(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !