leetcode题目链接
这道题用哈希表来解决 一个哈希表存放从单词到字符的映射,一个存放从字符到单词的映射,依照空格分隔字符,并将每个字符存放到vector字符数组,
遍历 pattern
,对于每个字符 c
和对应的单词 w
:
检查 charToWord
中是否已经存在映射,若存在且不匹配则返回 false
。
检查 wordToChar
中是否已经存在映射,若存在且不匹配则返回 false
。
否则,建立新的映射。
遍历结束没有发现不匹配,则返回true。
代码如下:
class Solution {
public:
bool wordPattern(string pattern, string s) {
unordered_map<char, string> charToWord;
unordered_map<string, char> wordToChar;
vector<string> words;
int pos = 0, start = 0;
// 用空格分割字符串 s
while ((pos = s.find(' ', start)) != string::npos) {
words.push_back(s.substr(start, pos - start));
start = pos + 1;
}
words.push_back(s.substr(start));
// 如果单词数量和模式长度不匹配,返回 false
if (words.size() != pattern.length()) {
return false;
}
for (int i = 0; i < pattern.length(); ++i) {
char c = pattern[i];
string w = words[i];
// 检查字符是否已映射到某个单词
if (charToWord.find(c) != charToWord.end()) {
if (charToWord[c] != w) {
return false; // 不匹配返回 false
}
} else {
charToWord[c] = w; // 新映射
}
// 检查单词是否已映射到某个字符
if (wordToChar.find(w) != wordToChar.end()) {
if (wordToChar[w] != c) {
return false; // 不匹配返回 false
}
} else {
wordToChar[w] = c; // 新映射
}
}
return true;
}
};
这里的s.find('',start)即从start的位置找到第一个空格的位置。
string::npos
是一个常数,表示查找操作未找到时的返回值。它通常用于判断 find
方法是否成功找到指定字符或子字符串。如果 find
返回 string::npos
,意味着未找到。