刚开始想到的是先便利pattern,然后再进行判断,这样就有两层循环。
在discussion里找到了新的方法,一边循环就出来了,思路如下:
使用两个unordered_map记录,一个记录pattern到str,另一个记录str到pattern,如果pattern里对应的str与当前的str不一样则返回false,如果str里对应的pattern与当前的不一样则返回false。
为什么要这样,为什么不是一个就行,要用两个?
是这样,如果pattern为abab,str为 dog dog dog dog,只使用一个unordered_map<pattern,str>无法判断出来。
这里使用了istringstream,将istringstream类执行使用C++风格串流输入风格。以空格为分界符,将数据分行输出
代码如下:
class Solution {
public:
bool wordPattern(string pattern, string str) {
string temp;
istringstream isstream(str);
unordered_map<char,string> m1;
unordered_map<string,char> m2;
vector<string> strvec;
while(isstream>>temp){
//cout<<temp;
strvec.push_back(temp);//将str里的数据放进strvec中
}
if(pattern.size()!=strvec.size())
return false;
for(int i=0;i<pattern.size();i++){
if(m1.find(pattern[i])!=m1.end()){
if(m1[pattern[i]]!=strvec[i])
return false;
}
else m1[pattern[i]]=strvec[i];
if(m2.find(strvec[i])!=m2.end()){
if(m2[strvec[i]]!=pattern[i])
return false;
}
else m2[strvec[i]]=pattern[i];
}
return true;
}
};