给定一种规律 pattern
和一个字符串 str
,判断 str
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern ="abba"
, str ="dog cat cat dog"
输出: true
示例 2:
输入:pattern ="abba"
, str ="dog cat cat fish"
输出: false
示例 3:
输入: pattern ="aaaa"
, str ="dog cat cat dog"
输出: false
示例 4:
输入: pattern ="abba"
, str ="dog dog dog dog"
输出: false
说明:
你可以假设 pattern
只包含小写字母, str
包含了由单个空格分隔的小写字母。
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<string,char>word_map;
char used_pattern[128] ={0};
int pos=0;
string word;
str.push_back(' ');
cout<<str.length();
for(int i=0;i<str.length();i++){
if(str[i]==' '){
if(pos==pattern.length()) return false;
if(word_map.find(word)==word_map.end()){
if(used_pattern[pattern[pos]]) return false;
word_map[word]=pattern[pos];
used_pattern[pattern[pos]]=1;
}
else{
if(word_map[word]!=pattern[pos]) {
return false;
}
}
word="";
pos++;
}
else
word +=str[i];
}
if(pos!=pattern.length()) return false;
return true;
}
};
class Solution {
public:
bool wordPattern(string pattern, string str) {
stringstream ss(str);
map<char, string> mp;
set<string> st;//存储所有出现过的字符串
string s;
int cnt = 0;
while (ss >> s) {
if(cnt==pattern.length()) return false;
char c=pattern[cnt++];
if(!mp.count(c)){
if(st.count(s)) return false;
mp[c]=s;
st.insert(s);
}
else
if(mp[c]!=s) return false;
}
return cnt == pattern.length();
}
};