Given a pattern
and a string str
, find if str
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 str
.
Examples:
- pattern =
"abba"
, str ="dog cat cat dog"
should return true. - pattern =
"abba"
, str ="dog cat cat fish"
should return false. - pattern =
"aaaa"
, str ="dog cat cat dog"
should return false. - pattern =
"abba"
, str ="dog dog dog dog"
should return false.
Notes:
You may assume pattern
contains only lowercase letters, and str
contains lowercase letters separated by a single space.
分析:
首先提取str = "dog cat cat dog"为,vecstr={"dog","cat","cat","dog"}
接着利用哈希map(unordered_map)建立对应关系,以下面这个测试案例为例
"abba"
"dog dog dog dog",应该返回false
建立对应正序关系1:通过判断已经被插入mapping1的元素是否矛盾来
mapping1['a']="dog",mapping1['b']="dog",mapping1['b']="dog",mapping1['a']="dog"
能通过测试,因为'a','b'对应的实值的确是"dog"
建立对应反序关系2:通过判断已经被插入mapping2的元素是否矛盾来
mapping2["dog"]='a',mapping2["dog"]='b',mapping2["dog"]='b',mapping2["dog"]='a'
不能通过测试,因为"dog"对应的实值是'a'不能'b',这里显然矛盾了
这位小伙伴尽然做的和我一样:http://blog.youkuaiyun.com/booirror/article/details/50084075
class Solution {
public:
bool wordPattern(string pattern, string str) {
//提取str = "dog cat cat dog"为,"dog","cat","cat","dog"
vector<string> vecstr;
int beginpos=0,endpos=0;
while( endpos < str.size() )
{
while(endpos < str.size()&& str[endpos]!=' ')
endpos++;
string sub=str.substr(beginpos,endpos-beginpos);
vecstr.push_back(sub);
beginpos=++endpos;
}
if(vecstr.size()!=pattern.size())
return false;
unordered_map<char,string> mapping1;
unordered_map<string,char> mapping2;
for(int i=0;i<pattern.size();i++)
{
if(mapping1.find(pattern[i])==mapping1.end())//正序判断
mapping1[pattern[i]]=vecstr[i];
else{
if(mapping1[pattern[i]]!=vecstr[i])
return false;
}
if(mapping2.find(vecstr[i])==mapping2.end())//逆序判断
mapping2[vecstr[i]]=pattern[i];
else{
if(mapping2[vecstr[i]]!=pattern[i])
return false;
}
}
return true;
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.youkuaiyun.com/ebowtang/article/details/50651635
原作者博客:http://blog.youkuaiyun.com/ebowtang