290. Word Pattern一个击败了100C++用户的代码

题目描述

Given a pattern and a string s, find if s follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.

Example 1:

Input: pattern = “abba”, s = “dog cat cat dog”
Output: true

Example 2:

Input: pattern = “abba”, s = “dog cat cat fish”
Output: false

Example 3:

Input: pattern = “aaaa”, s = “dog cat cat dog”
Output: false

Example 4:

Input: pattern = “jquery”, s = “jquery”
Output: false

Constrains:

  • 1 <= pattern.length <= 300
  • pattern contains only lower-case English letter.
  • 1 <= s.length <= 3000
  • s contains only lowercase English letters ans spaces ’ '.
  • s does not contain any leading or trailing spaces.

解答思路

这题需要s包含的单词与pattern逐字母的进行映射,比如pattern是abba,那么s包含的字符也需要是对称的。这里需要注意当pattern与s一样的时候,输出为false,因为s应该与pattern每一个字母做映射,而不是整体。
思路类似205. Isomorphic String,做双向的映射。pattern每个字母与s里的每个单词做映射,单向的还不够,因为有可能出现abc,与"dog cat dog"对应时,a和c都对应上dog了。

class Solution {
public:
   bool wordPattern(string pattern, const string& s) {       
        return wordPatternHelp(pattern, s) && wordPatternHelp2(pattern, s);
    }
    void split_string(vector<string> &ves, string str){
        istringstream ss(str);
        string s;
        while(ss >> s){
            ves.push_back(s);
        }
    }
    bool wordPatternHelp(string pattern, string s) {
        unordered_map<char, string> m;
        vector<string> ves;
        split_string(ves, s);
        if(pattern.length() > ves.size())
            return false;
        for(int i = 0; i < pattern.length(); i++){
            if(m.find(pattern[i]) != m.end()){
                if(m[pattern[i]] != ves[i])
                    return false;
            }
            else
                m[pattern[i]] = ves[i];
        }
        return true;
    }
    bool wordPatternHelp2(string pattern, string s){
        unordered_map<string, char> m;
        vector<string> ves;
        split_string(ves, s);
        for(int i = 0; i < ves.size(); i++){
            if(m.find(ves[i]) != m.end()){
                if(m[ves[i]] != pattern[i])
                    return false;
            }
            else
                m[ves[i]] = pattern[i];
        }
        return true;
    }
};

在这里插入图片描述

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starleeisamyth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值