给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。
#include <string>
#include <unordered_map>
#include <sstream>
using namespace std;
class Solution {
public:
bool wordPattern(string pattern, string s) {
unordered_map<char, string> charToWord;
unordered_map<string, char> wordToChar;
istringstream ss(s);
string word;
for (char c : pattern) {
if (!(ss >> word)) // 如果没有更多单词了,返回 false
return false;
// 如果当前字符已经在哈希表中,检查是否对应的单词匹配
if (charToWord.find(c) != charToWord.end()) {
if (charToWord[c] != word)
return false;
} else {
// 如果当前单词已经在哈希表中,检查是否对应的字符匹配
if (wordToChar.find(word) != wordToChar.end()) {
if (wordToChar[word] != c)
return false;
} else {
// 如果当前字符和单词都不在哈希表中,进行映射
charToWord[c] = word;
wordToChar[word] = c;
}
}
}
// 检查是否还有多余的单词
return !(ss >> word);
}
};
遍历 pattern 中的每个字符,同时使用istringstream从字符串 s 中提取单词。在遍历过程中,建立字符到单词的映射和单词到字符的映射,并检查映射是否正确。如果遍历完 pattern 后,仍然存在未匹配的单词,则返回 false。
时间复杂度分析:
这个算法的时间复杂度取决于字符串 s 中单词的数量和 pattern 的长度,设 n 为 s 中单词的数量,m 为 pattern 的长度:
遍历 pattern 的过程中,需要将每个字符映射到对应的单词,这需要 O(m) 的时间复杂度。
使用istringstream从字符串 s 中提取单词的过程中,需要 O(n) 的时间复杂度。
最后检查是否还有多余的单词,需要 O(1) 的时间复杂度。
因此,总的时间复杂度为 O(m + n)。
空间复杂度分析
空间复杂度主要取决于哈希表的存储,哈希表的大小取决于 pattern 中唯一字符的数量和 s 中单词的数量:
哈希表 charToWord 存储了 pattern 中的每个字符到对应的单词,空间复杂度为 O(字符集大小)。
哈希表 wordToChar 存储了 s 中的每个单词到对应的字符,空间复杂度也为 O(单词数量)。
因此,总的空间复杂度为 O(字符集大小 + 单词数量)。