2020-12-16 单词规律

题目


解法

在这道题中,模式(pat)与单词(word)必须是1-1对应的关系,因此可使用两个哈希表来存储映射关系,若双方不匹配便返回false;如果pat的个数与word的个数不相等,也返回flase。

class Solution {
public:
    bool wordPattern(string pattern, string s) {
        unordered_map<char, string> ch_str_map;
        unordered_map<string, char> str_ch_map;
        int j  = 0;
        bool isOver = false;
        for (int i = 0; i < pattern.size(); i++) {
            auto pat_it = ch_str_map.find(pattern[i]);
            string word = readNextWord(s, j, isOver);

            if (isOver) {   // word已经提取完成
                if (i+1 < pattern.size()) { // 模式多余
                    return false;
                }
            }
            if (pat_it == ch_str_map.end()) {   // 该模式还未加入map中
                if (str_ch_map.find(word) == str_ch_map.end()){     // 该word没有加入map中
                    if (word != ""){    // 返回的为非空串
                        ch_str_map.insert(pair<char, string>(pattern[i], word));
                        str_ch_map.insert(pair<string, char>(word, pattern[i]));
                    }
                } else {    // 两个模式映射为同一个word,不可取
                    return false;
                }
            } else {    // 若该模式已加入map
                if (pat_it->second != word) {   // 模式不匹配
                    return false;
                }
            }
        }

        if (j < s.size()) {
            return false;
        }

        return true;
    }

    string (string &s, int &j, bool &isOver) {
        string word = "";
        while (j < s.size() && s[j] != ' ') {
            word += s[j++];
        }
        if (j >= s.size()) {
            isOver = true;
        }

        ++j;
        return word;
    }
};

提交结果


总结

今天的题目比较简单,思路也很快就出来了,但是在一些小细节的地方总抓不住,老是忽略某些可能特殊输入,程序鲁棒性不够;另一个问题是对STL的使用不熟练以及代码习惯等原因,同样的功能,我的代码远比Leetecode官方的代码冗长。此二点值得注意。

CS专业在读,热爱编程。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
原文地址:https://www.cnblogs.com/jmhwsrr/p/14145999.html