Runtime: 0 ms, faster than 100.00% of C++ online submissions for Word Pattern.
Memory Usage: 7.9 MB, less than 100.00% of C++ online submissions for Word Pattern.
思路简单,主要是逻辑清楚,想的要全面,可能也没有什么简便方法了
class Solution {
public:
bool wordPattern(string pattern, string str) {
//记录每个字母对应的index
vector<vector<int>> letters;
letters.resize(26);
for(size_t index = 0; index < pattern.length(); ++index){
letters[pattern[index]-'a'].push_back(index);
}
//按顺序分割字符串
vector<string> str_vector;
int start = 0, end = 0;
for(; end < str.length(); ++end){
if(str[end] == ' '){
str_vector.push_back(str.substr(start, end-start));
start = end+1;
}
}
str_vector.push_back(str.substr(start, end-start+1));
//pattern中字母的数字和str中字符串的个数不一样
if(pattern.length() != str_vector.size())
return false;
//记录某个字符串是否与某个字母对应过了,避免一个字符串对应多个字母。也就是说字母和字符串要求一一对应
unordered_set<string> set;
for(int letter_index = 0; letter_index < 26; ++letter_index){
//判断是否该字符串出现过了
if(!letters[letter_index].empty()){
if(set.find(str_vector[letters[letter_index][0]]) == set.end()){
set.insert(str_vector[letters[letter_index][0]]);
}else{
return false;
}
}
//判断某个字母对应的字符串们是否一致
if(letters[letter_index].size() > 1){//至少出现了两次
for(const auto& index : letters[letter_index]){
if(str_vector[index] != str_vector[letters[letter_index].front()])
return false;
}
}
}
return true;
}
};