### LeetCode  • ㊗️
• 大家
• offer
• 多多！

## Problem

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.

Example 1:

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


Example 2:

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


Example 3:

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


Example 4:

Input: pattern = "abba", s = "dog dog dog dog"
Output: false


Constraints:

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

## Code

class Solution {
public boolean wordPattern(String pattern, String str) {
String[] words = str.split("\\s+");
if(words.length != pattern.length()){
return false;
}

HashMap<Character,String> map = new HashMap<>();
for(int i = 0; i < pattern.length(); i++){
char c = pattern.charAt(i);
String word = words[i];

if(map.containsKey(c)){
if(!map.get(c).equals(word)){
return false;
}
} else {
if(map.containsValue(word)){
return false;
}
}

map.put(c, word);
}

return true;
}
}

class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
dd = defaultdict(str)

words = s.split()

if len(words) != len(pattern):
return False

for pp, word in zip(pattern, words):
if pp in dd and dd[pp] != word:
return False

if pp not in dd and word in dd.values():
return False

dd[pp] = word

return True