LeetCode 0290. Word Pattern Solution in Java, Python, C++, JavaScript, Go & Rust | Explanation + Code

CoderIndeed
0
0290. Word Pattern

Description

Given a pattern and a string s, find if s follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s. Specifically:

  • Each letter in pattern maps to exactly one unique word in s.
  • Each unique word in s maps to exactly one letter in pattern.
  • No two letters map to the same word, and no two words map to the same letter.

 

Example 1:

Input: pattern = "abba", s = "dog cat cat dog"

Output: true

Explanation:

The bijection can be established as:

  • 'a' maps to "dog".
  • 'b' maps to "cat".

Example 2:

Input: pattern = "abba", s = "dog cat cat fish"

Output: false

Example 3:

Input: pattern = "aaaa", s = "dog cat cat dog"

Output: false

 

Constraints:

  • 1 <= pattern.length <= 300
  • pattern contains only lower-case English letters.
  • 1 <= s.length <= 3000
  • s contains only lowercase English letters and spaces ' '.
  • s does not contain any leading or trailing spaces.
  • All the words in s are separated by a single space.

Solutions

Solution 1: Hash Table

First, we split the string s into a word array ws with spaces. If the length of pattern and ws is not equal, return false directly. Otherwise, we use two hash tables d_1 and d_2 to record the correspondence between each character and word in pattern and ws.

Then, we traverse pattern and ws. For each character a and word b, if there is a mapping for a in d_1, and the mapped word is not b, or there is a mapping for b in d_2, and the mapped character is not a, return false. Otherwise, we add the mapping of a and b to d_1 and d_2 respectively.

After the traversal, return true.

The time complexity is O(m + n) and the space complexity is O(m + n). Here m and n are the length of pattern and string s.

PythonJavaC++GoTypeScriptRustC#
class Solution: def wordPattern(self, pattern: str, s: str) -> bool: ws = s.split() if len(pattern) != len(ws): return False d1 = {} d2 = {} for a, b in zip(pattern, ws): if (a in d1 and d1[a] != b) or (b in d2 and d2[b] != a): return False d1[a] = b d2[b] = a return True(code-box)

Solution 2

TypeScript
function wordPattern(pattern: string, s: string): boolean { const hash: Record<string, string> = Object.create(null); const arr = s.split(/\s+/); if (pattern.length !== arr.length || new Set(pattern).size !== new Set(arr).size) { return false; } for (let i = 0; i < pattern.length; i++) { hash[pattern[i]] ??= arr[i]; if (hash[pattern[i]] !== arr[i]) { 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 !