【C++】每日一题 290 单词规律

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

cpp 复制代码
#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(字符集大小 + 单词数量)。

相关推荐
LOVE️YOU2 小时前
Python 中 Tuple 为什么有时可 Hash,有时不可 Hash?
开发语言·python·哈希算法
李永奉3 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
小oo呆3 小时前
【学习心得】迭代器和可迭代对象
开发语言·python
AC赳赳老秦3 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up3 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
迅猛龙办公室3 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
无名猿3 小时前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库
杨丰玮4183 小时前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
程序猿编码4 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
言乐65 小时前
Python实现语音审核模型
开发语言·python·django·virtualenv·pygame