字符串---39.字符规律
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 包含了由单个空格分隔的小写字母。
代码:

代码:
#include <iostream> #include <string> #include <vector> #include <map> //#include <utility> using namespace std; class Solution { public: vector<string> SplitStr(string str, char c) { vector<string> wordVec; int pos = str.find(c); while (pos != std::string::npos) { wordVec.push_back(str.substr(0, pos)); cout << str.substr(0, pos) << endl; str = str.substr(pos + 1); pos = str.find(c); } wordVec.push_back(str); cout << str << endl; return wordVec; } bool wordPattern(string pattern, string str) { vector<string> wordVec = SplitStr(str, ' '); map<string, char> wordMap; map<char, bool> used; // 1、这一点容易丢分 if (pattern.length() != wordVec.size()) { return false; } for (size_t i = 0; i < wordVec.size(); i++) { auto tmp = used.find(pattern[i]); if (tmp == used.end()) { used.insert(make_pair(pattern[i], true)); auto tmp2 = wordMap.find(wordVec[i]); if (tmp2 != wordMap.end() && pattern[i] != wordMap[wordVec[i]]) { // 2、注意防止覆盖 return false; } wordMap.insert(make_pair(wordVec[i], pattern[i])); } else { if (pattern[i] != wordMap[wordVec[i]]) { return false; } } } return true; } }; int main() { string pattern = "abba"; string str = "dog cat cat dog"; Solution s; bool ret = s.wordPattern(pattern, str); cout << ret << endl; ret = s.wordPattern("abba", "dog dog dog dog"); cout << ret << endl; ret = s.wordPattern("ab", "dog dog"); cout << ret << endl; return 0; }
这里有几个丢分的点,要注意一下

其中,字符串分隔的代码,要熟练掌握,经常用到。

浙公网安备 33010602011771号