Given a pattern
and a string str
, find if str
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 str
.
Example 1:
Input: pattern ="abba"
, str ="dog cat cat dog"
Output: true
Example 2:
Input:pattern ="abba"
, str ="dog cat cat fish"
Output: false
Example 3:
Input: pattern ="aaaa"
, str ="dog cat cat dog"
Output: false
Example 4:
Input: pattern ="abba"
, str ="dog dog dog dog"
Output: false
Notes:
You may assume pattern
contains only lowercase letters, and str
contains lowercase letters that may be separated by a single space.
class Solution:
def wordPattern(self, pattern: str, s: str) -> bool:
ch2str, str2ch = {}, {}
ss = s.split(' ')
n = len(pattern)
if n != len(ss):
return False
for i in range(n):
if ch2str.get(pattern[i]) is not None and ch2str.get(pattern[i]) != ss[i]:
return False
if str2ch.get(ss[i]) is not None and str2ch.get(ss[i]) != pattern[i]:
return False
ch2str[pattern[i]] = ss[i]
str2ch[ss[i]] = pattern[i]
return True
class Solution {
public boolean wordPattern(String pattern, String s) {
Map<Character, String> ch2str = new HashMap<>();
Map<String, Character> str2ch = new HashMap<>();
String[] ss = s.split(" ");
int n = pattern.length();
if (n != ss.length) {
return false;
}
for (int i = 0; i < n; ++i) {
char ch = pattern.charAt(i);
if (ch2str.containsKey(ch) && !ch2str.get(ch).equals(ss[i])) {
return false;
}
if (str2ch.containsKey(ss[i]) && !str2ch.get(ss[i]).equals(ch)) {
return false;
}
ch2str.put(ch, ss[i]);
str2ch.put(ss[i], ch);
}
return true;
}
}