原题目
代码分析
c++stl(map, set, stringstream)
map: 用于存储字母和单词之间的映射关系
set: 用于存储出现过的单词
stringstream: 用于分割单词
错误条件:
1.单词比字母多
2.字母比单词多
3.一个字母对应多个单词
4.一个单词对应多个字母
class Solution {
public:
bool wordPattern(string pattern, string str) {
stringstream stream(str);//字符流,分割单词
string word;//获取单词
map<char,string>mp;//字母和单词映射
set<string>st;//单词集合
int i = 0;//pattern下标
while(stream>>word){
if(i >= pattern.size())return false;//考虑当字母遍历完,但单词还有的情况
char c = pattern[i++];
if(!mp.count(c)&&!st.count(word)){//如果字母和单词都不存在,添加
//1.防止两个字母映射同一个单词
//2.防止连个单词映射同一个字母
mp[c]=word;
st.insert(word);
}else if(mp[c]!=word){//如果字母的映射和当前单词不一样,错误
//即字母的映射为空(字母不存在于map中)或字母映射为其他单词
return false;
}
}
return i==pattern.length();//考虑单词遍历完,但字母还有的情况
}
};
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char,string>m1;
map<string,char>m2;
int j = 0;
int i = 0;
while(i < str.size()&&j < pattern.size()){
string word;
while(i < str.size()&&str[i]!=' '){//获取单词
word += str[i++];
}
if(str[i]==' ') i++;//如果是空格下标加一
char c = pattern[j++];//获取字母
if(m1.count(c)==0&&m2.count(word)==0){//两者映射都不存在
m1[c] = word;
m2[word] = c;
}else if(m1[c] != word){
//判断映射相同,为什么不需要"或m2[word]!=c"
//因为上一个if判断两者都不存在才添加,确保了唯一性,相互的映射值一定是对应的
//如果m1的c存在,m2的word不存在,说明m1的c对应值不为word
//如果m1的c不存在,m2的word存在,m1的c映射为空,与word也不匹配
//如果m1的c存在,m2的word也存在,如果其中一个的映射等于另一个,那另一个的映射也一定等于它本身
return false;
}
}
return j == pattern.size()&&i == str.size();//如果其中有一个没有遍历完说明不匹配
}
};