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.
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;
}
}