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.
这里主要是字符与字符串对应映射问题,首先将有空格分开的字符串用一个vector<string>容器存储,对应与字符存储的pattern=n,然后利用C++映射容器map,涉及的主要有:
1.string &append(int n,char c); //在当前字符串结尾添加n个字符c
2.vector的push_back操作;
3.map<key,key_value>里find()函数返回一个迭代器指向键值为key的元素key_value,如果没找到就返回指向map尾部的迭代器
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char ,string>Map1;
map<string,char>Map2;
vector<string>::iterator p;
string temp("");
vector<string> vec;
int l=str.length();
int i;
for(i=0;i<l;i++){
if(str.at(i)==' '){vec.push_back(temp);temp="";continue;}
else {temp.append(1,str.at(i));}
}
if(i==l)vec.push_back(temp);
// for(p=vec.begin();p!=vec.end();p++){cout<<*p<<" ";}
int n=pattern.length();
if(n!=vec.size())return 0;
for(i=0;i<n;i++)
{if(Map1.find(pattern[i])==Map1.end()&&Map2.find(vec[i])==Map2.end())
{Map1.insert(pair<char,string>(pattern[i],vec[i]));
Map2.insert(pair<string,char>(vec[i],pattern[i]));
}
else if(Map1[pattern[i]]!=vec[i]||Map2[vec[i]]!=pattern[i])return 0;
}
return 1;
}
};