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
Constraints:
1 <= pattern.length <= 300pattern contains only lower-case English letters.1 <= s.length <= 3000s contains only lowercase English letters and spaces ' '.s does not contain any leading or trailing spaces.s are separated by a single space.class Solution {
public:
bool wordPattern(string pattern, string s) {
unordered_map <char, string> m;
unordered_map <string, char> n;
stringstream ss(s);
int i=0;
string word;
while (ss >> word) {
auto a = m.find(pattern[i]);
auto str = n.find(word);
if(a==m.end() && str==n.end()){ // new key
m.insert({pattern[i], word});
n.insert({word, pattern[i]});
}
else if((a!=m.end() && a->second!=word) || (str!=n.end() && str->second!=pattern[i]))
return false;
i++;
}
if(i!=pattern.length()) // check if char-word count same
return false;
return true;
}
};/**
* @param {string} pattern
* @param {string} s
* @return {boolean}
*/
var wordPattern = function(pattern, s) {
var v = s.split(' ');
if(v.length!==pattern.length)
return false;
var map1 = {};
var map2 = {};
for(var i=0; i<pattern.length; i++){
if(!(pattern[i] in map1) && !(v[i] in map2)){
map1[pattern[i]] = v[i];
map2[v[i]] = pattern[i];
}
else if(map1[pattern[i]]!==v[i] || map2[v[i]]!==pattern[i])
return false;
}
return true;
};