给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 s
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", s = "dog cat cat dog" 输出: true
示例 2:
输入:pattern = "abba", s = "dog cat cat fish" 输出: false
示例 3:
输入: pattern = "aaaa", s = "dog cat cat dog" 输出: false
class Solution { public: bool wordPattern(string pattern, string s) { unordered_map<char,string> p2s; // pattern字符到s字符串中单词的映射 unordered_map<string, char> s2p; // s字符串中单词到pattern字符的映射 int n = pattern.size(); // 模式字符串的长度 int m = s.size(); // 输入字符串的长度 int left = 0; // 左指针,用于标记单词的开始位置 int right = 0; // 右指针,用于标记单词的结束位置 char ch; // 用于存储当前模式中的字符 string word; // 用于存储从s中分割出来的单词 // 遍历模式字符串的每一个字符 for(int i = 0; i < n; i++) { if(left >= m) return false; // 如果左指针超过了s的长度,说明s中的单词数量少于模式中的字符数量,返回false // 找到一个完整的单词 while(right < m && s[right] != ' ') right++; word = s.substr(left, right - left); // 从s中截取当前单词 ch = pattern[i]; // 获取当前模式中的字符 // 检查当前映射是否一致,如果不一致,返回false if((p2s.count(ch) && p2s[ch] != word) || (s2p.count(word) && s2p[word] != ch)) { return false; } // 添加或更新当前字符和单词的映射关系 p2s[ch] = word; s2p[word] = ch; // 移动指针,为寻找下一个单词做准备 left = right + 1; right = left; } // 如果最后left的位置恰好是字符串s的长度加1(因为最后会多加一个),说明s中的单词数量和模式字符串中的字符数量完全匹配 return left == m + 1; } };