leetcode.290:单词规律

该博客讨论了LeetCode 290题——单词规律,探讨如何判断一个字符串是否遵循特定的字母模式。通过举例说明了匹配条件,并提出了利用哈希映射的解决方案,强调了双向映射的检查和数量一致性在解决此问题中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

示例1:

输入: pattern = “abba”, str = “dog cat cat dog”
输出: true
示例 2:

输入:pattern = “abba”, str = “dog cat cat fish”
输出: false
示例 3:

输入: pattern = “aaaa”, str = “dog cat cat dog”
输出: false
示例 4:

输入: pattern = “abba”, str = “dog dog dog dog”
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

通过次数25,381提交次数59,271

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:
利用map,对pattern和str进行一一匹配,每次有新的pattern和str对的时候检查是否相对应,同时记录pattern和str的数量,如果出现不对应或者遍历结束,数量不同,则返回false,否则返回true。
注意:需要进行双向的hash匹配,但是可以不需要两个map,因为可以使用int类型的大小为128的数组对pattern进行记录,当没有在map之中找到str对于的pattern是,需要进行插入操作,但在这之前需要进行检查,如果出现了pattern之前已经用过,即数组中已经标记为用过,而此时的str不对应当前的pattern,需要返回false。(不对应的情况)

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        unordered_map<string,int> str_hash;
        vector<int> pattern_hash(128,0);

        int len_str = str.size();
        int len_pattern = pattern.size();

        int strl = 0 ;
        int im = 0;
        for(int i = 0,j=0;i<len_str&&j<len_pattern;i++,j++)
        {
            string temps = "";
            while(i<len_str&&str[i]!=' ')
            {
                temps+=str[i];
                i++;
            }
            im = im>i?im:i;
            strl++;
            unordered_map<string,int>::iterator it;
            it = str_hash.find(temps);
            //cout<<"temps:"<<temps<<endl;
            //cout<<"pattern[j]:"<<pattern[j]<<endl;
            
            if(it!=str_hash.end()&&it->second!=pattern[j])
            {
                return false;
            }
            else if(it==str_hash.end())
            {
                if(pattern_hash[pattern[j]]!=0)
                {
                    return false;
                }
                else
                {
                    str_hash.insert(pair<string,int>(temps,pattern[j]));
                    pattern_hash[pattern[j]]++;
                }
            }
        }
        cout<<im;
        if(strl!=len_pattern||im!=len_str)return false;
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值