原题链接:Leetcode290. Word Pattern
Given a pattern
and a string s
, find if s follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.
Example 1:
Input: pattern = "abba", s = "dog cat cat dog"
Output: true
Example 2:
Input: pattern = "abba", s = "dog cat cat fish"
Output: false
Example 3:
Input: pattern = "aaaa", s = "dog cat cat dog"
Output: false
Constraints:
- 1 <= pattern.length <= 300
- pattern contains only lower-case English letters.
- 1 <= s.length <= 3000
s
contains only lowercase English letters and spaces' '
.s
does not contain any leading or trailing spaces.- All the words in s are separated by a single space.
方法一:哈希表
思路:
题目要求字母和字符串满足 双射 关系
维护两个哈希表,当不满足双射是返回false
c++代码:
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<string, char> s_c;
unordered_map<char, string> c_s;
int m = str.size();
int i = 0;
for (auto ch : pattern) {
if (i >= m) {
return false;
}
// 找到一个单词
int j = i;
while (j < m && str[j] != ' ') j++;
const string &tmp = str.substr(i, j - i);
// 不满足双射
if (s_c.count(tmp) && s_c[tmp] != ch) {
return false;
}
if (c_s.count(ch) && c_s[ch] != tmp) {
return false;
}
// 添加到哈希表
s_c[tmp] = ch;
c_s[ch] = tmp;
i = j + 1;
}
return i >= m;
}
};
复杂度分析:
- 时间复杂度:O(m+n),插入和查询哈希表的均摊时间
- 空间复杂度:O(m+n),两个哈希表会存两个字符串的全部信息