【LeetCode】290.单词规律【哈希】

1.题目链接
点击这里

2.解题思路
pattern中字符构成的集合与所有单词构成的集合若形成双射,则匹配成功;否则匹配失败。用两个哈希表来记录映射关系,由于单个哈希表只能体现单向的映射关系(即只能反映A到B存在映射关系,即只能反映是否为满射,不能反映是否为单射)所以需要再来一个哈希表记录从B到A的映射关系,只由两个表对应且一一对应,才能说匹配成功。

3.代码

class Solution {
public:
    bool wordPattern(string pattern, string s) {

        unordered_map<string,char> mp;//s->pattern
        unordered_map<char,string> np;//pattern->s

        int i,j;
        for(i=0,j=0;i<(int)pattern.size()&&j<(int)s.size();){

            string mid="";
            int k;
            for(k=j;k<(int)s.size()&&s[k]!=' ';k++) mid+=s[k];
            
            if(mp.count(mid)&&mp[mid]!=pattern[i]) return false;//不满足单射,当前单词相应的符号不是之前这个单词确定好的匹配符号
            if( np.count(pattern[i])&&np[pattern[i]]!=mid ) return false;//同理,不满足单射
            mp[mid]=pattern[i];
            np[pattern[i]]=mid;
            j=k+1;
            i++;
        }

        return i>=(int)pattern.size()&&j>=(int)s.size();//需满足满射
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值