leetcode 290.单词规律

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
 
思路:使用map<string,char>键值对的方式记录,查找是否匹配

代码:

#include"iostream"
using namespace std;
#include"map"

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        map<string, char> word_map;//单词到pattern字符的映射
        char used[128] = { 0 };//标记已被用到的字符
        string word;//暂存临时拆分的单词
        int pos = 0;//当前指向的pattern字符
        str.push_back(' ');//尾部push一个空格,使得遇到空格就拆分单词
        for (int i = 0; i < str.length(); i++) {
            if (str[i] == ' ') {//遇到空格,即拆分出一个单词
                if (pos == pattern.length()) {//第一种的false:pos指到pattern最后,但仍有新单词被拆分出来,数量不匹配
                    return false;
                }
                if (word_map.find(word) == word_map.end()) {//若这个单词未出现在哈希映射中
                    if (used[pattern[pos]]) {//第二种的false:单词未出现,但是pos所指位置已有指向
                        return false;
                    }
                    //word_map.insert(map<string, char>::value_type(word, pattern[pos]));
                    //word_map.insert(pair<string, char>(word, pattern[pos]));
                    word_map[word] = pattern[pos];//未出现上述两种情况,查入元素
                    
                    used[pattern[pos]] = 1;//设置标记,哈希字符
                }
                else {
                    if (word_map[word] != pattern[pos]) {//第三种的false:单词出现在哈希映射,但是与pos当前所指的不符
                        return false;
                    }
                }
                word = "";//完成一个单词的插入和查询后,清空word
                pos++;//指向pattern字符的pos指针前移
            }
            else {
                word += str[i];//未遇到空格,继续加加,构造单词
            }
        }//已经扫描完string所有的单词
        if (pos != pattern.length()) {//第四种的false:pos还没指到pattern最后,数量不匹配
            return false;
        }
        return true;
    }
};

//测试
int main() {
    string pattern = "abba";
    string str = "cat dog dog cat";
    Solution s1;
    bool wordp = s1.wordPattern(pattern, str);
    cout << wordp << endl;
    system("pause");
}

 

map的使用基础:

map元素的访问
        1、通过下标访问:
                和访问不同的数组是一样的,例如对一个定义为map<string, char> word_map的map来说,
                就可以直接使用word_map[string word]的方式来访问它对应的字符。但是要注意,map中的键是唯一的。
        2、通过迭代器访问
   map元素的插入:
         1、通过insert插入元素
                   1.1 word_map.insert(map<string,char>::value_type(word,pattern[pos]));;
                    1.2 word_map.insert(pair<string,char>(word,pattern[pos]);;
         2、通过下标插入元素
                    2.1 word_map[word]=pattern[pos];;

posted @ 2020-03-25 16:51  一二三的三二一  阅读(203)  评论(0)    收藏  举报