和这题类似:LeetCode第 205 题:同构字符串(C++)_zj-CSDN博客
先来个哈希表的把:
class Solution {
public:
bool wordPattern(string pattern, string str) {
int n = pattern.size();
unordered_map<int, string> m;
vector<string> vec;//保存单词
string s;
for(const auto &c : str){
if(isspace(c)){
vec.push_back(s);
s.clear();
continue;
}
s += c;
}
vec.push_back(s);
if(n != vec.size()) return false;
for(int i = 0; i < n; ++i){
if(m.count(pattern[i])){
if(m[pattern[i]] != vec[i]) return false;
}else{
for(auto v : m){//此处可以优化,多一个哈希表set就可以免去查找
if(v.second == vec[i]) return false;
}
m[pattern[i]] = vec[i];
}
}
return true;
}
};
进行优化,使用哈希函数编码:
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<int> m(26, -1);
unordered_set<int> set;
int i = 0;
for(const auto &c : pattern){
int hash = 0;
for(; i < str.size() && isalpha(str[i]); ++i){//计算哈希值
hash += (str[i]-'a')*(str[i]-'a') + 1;//这个哈希函数就是随便设计的
}
++i;//跳过当前的空格
if(m[c-'a'] != -1){
if(m[c-'a'] != hash) return false;
}else{
if(set.count(hash)) return false;//已经有元素指向它了
set.insert(hash);
m[c-'a'] = hash;
}
}
if(i != str.size()+1) return false;//因为for循环下面有有一个++i
return true;
}
};