【Leetcode290】Word Pattern

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;
    }
};
发布了112 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39458342/article/details/104787231