LeetCode-290. Word Pattern

Description

这里写图片描述

Examples

这里写图片描述

Notes

这里写图片描述

Solution 1(C++)

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        vector<string> strvec;
        size_t found=str.find(" "), i=0;
        while(found!=string::npos){
            strvec.push_back(str.substr(i,found-i));
            i=found+1; found=str.find(" ",i);
        }
        strvec.push_back(str.substr(i));
        unordered_map<char,int> mp;
        unordered_map<string,int> ms;
        for(int j=0;j<pattern.size();j++){
            if(mp[pattern[j]]!=ms[strvec[j]]) return false; 
            mp[pattern[j]]=j+1;
            ms[strvec[j]]=j+1;
        }
        return true;
    }
};

Error

这里写图片描述

Solution 2(C++)

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        vector<string> strvec;
        size_t found=str.find(" "), i=0;
        while(found!=string::npos){
            strvec.push_back(str.substr(i,found-i));
            i=found+1; found=str.find(" ",i);
        }
        strvec.push_back(str.substr(i));
        unordered_map<char,int> mp;
        unordered_map<string,int> ms;
        if(pattern.size()!=strvec.size()) return false;
        for(int j=0;j<pattern.size();j++){
            if(mp[pattern[j]]!=ms[strvec[j]]) return false; 
            mp[pattern[j]]=j+1;
            ms[strvec[j]]=j+1;
        }
        return true;
    }
};

算法分析

要做这道题,就不得不提起前两天做过的一道题:LeetCode-205. Isomorphic Strings

两道题的核心思想都是一样的。都是想判断一个字符串是否满足另一个字符串的形式。

这道题解法一与解法二其实主体思路都一样,只是出现如Error中所示,当pattern与string长度相同时,后面的索引就会报错。

还需要注意的一点就是:

    mp[pattern[j]]=j+1;
    ms[strvec[j]]=j+1;

为什么要用j+1。而我最开始用的是++。因为为了区别不同位置对应的值。如果都是++的话,就无法区分“abba”,中a与b的位置了。

程序分析

这次我尝试用string.find()函数来实现提取string中空格分隔的各个单词。如下:

    vector<string> strvec;
    size_t found=str.find(" "), i=0;
    while(found!=string::npos){
        strvec.push_back(str.substr(i,found-i));
        i=found+1; found=str.find(" ",i);
    }
    strvec.push_back(str.substr(i));

现在知道了如何在LeetCode中进行代码调试。所以做题效率应该可以大大提高。

然后还是多注意临界条件的判断,在保证主体逻辑正确的情况下,多考虑考虑特殊情况。其实说白了,还是在写代码的时候要多注意一些限制条件。比如:ms[strvec[j]]=j+1; 在写这句的时候就应该知道由于j是以pattern的长度为上限的,所以这里不能严格保证strvec有j的索引。就需要加入特殊条件的判断:

    if(pattern.size()!=strvec.size()) return false;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值