leetcode 290.单词规律
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
输出: false
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
你可以假设 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];;

浙公网安备 33010602011771号