LeetCode290. 单词规律
可以用两个哈希表分别记录pattern到str(即字母到单词)和str到pattern(即单词到字母)的映射。
然后检查两个哈希表中的记录,比如某个字母之前已经映射到某个单词,但存在和这个映射矛盾的映射(字母映射到别的单词),
或者是存在某个矛盾的从单词到字母的映射,就返回false。
否则,遍历完发现不存在矛盾的情况,就返回true。
代码如下:
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> words;
for(int i = 0; i < str.size(); ++i) { // 因为str里含有空格,所以我们用双指针先把所有的非空单词拆出来,放到一个vector<string> words里
while(i < str.size() && str[i] == ' ') {
++i;
}
int j = i;
while(j < str.size() && str[j] != ' ') {
++j;
}
string word = str.substr(i, j - i);
words.push_back(word);
i = j;
}
if(words.size() != pattern.size()) { // 如果pattern中字母数量和str的单词数量不同,就无法匹配
return false;
}
int size = pattern.size();
unordered_map<char, string> Hash1; // Hash1记录pattern中的字母对应str中的单词的映射,Hash2相反
unordered_map<string, char> Hash2;
for(int i = 0; i < size; ++i) {
char p = pattern[i];
string s = words[i];
if(Hash1.count(p) != 0 && Hash1[p] != s) { // 如果之前字母p已经映射了一个单词,且这个单词和现在字母p对应的单词s不同,则矛盾
return false;
} else {
Hash1[p] = s;
}
if(Hash2.count(s) != 0 && Hash2[s] != p) { // 如果之前单词s已经映射了一个字母,且这个字母和现在单词s对应的字母p不同,则矛盾
return false;
} else {
Hash2[s] = p;
}
}
return true;
}
};
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用