290. Word Pattern

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求
Given a pattern and a string str, find if str 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 str.
这里写图片描述
给定两个字符串,一个表示pattern模式,一个表示等待判断的字符串——第二个字符串中单词出现的次序是否满足pattern的顺序。

2,题目思路
个人的思路是利用vector将字符数字化,然后通过比较数字来实现模式匹配。不过还是有点麻烦,将pattern进行数字化比较简单,但是将str中的字符串数字化比较麻烦。如何快速的读取str中的每个单词也是个问题。
首先,对于字符串中单词的读取,用到的是istringstream方法。这种方法在读取字符串时,会自动将空格作为分隔而读取对应的每个连续的字符串——在题目中为单词。
其次,在对单词进行数字化时,利用map容器是个更好的选择——既存有单词/字符,又有对应的数字(index)。

3,程序源码

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        map<char, int> pattern2index;
        map<string, int> str2index;
        istringstream in(str);
        int i =0, n = pattern.size();
        for(string word;in>>word;i++)
        {
            if(i == n || pattern2index[pattern[i]] != str2index[word])  //i==n说明pattern和str长度不一致,无法匹配;
                return false;
            pattern2index[pattern[i]] = i+1;
            str2index[word] = i+1;
        }
        return i == n;
    }
};

需要注意的是:

  • if(i == n || pattern2index[pattern[i]] != str2index[word])
    该语句表明,如果i==n时,说明word的数量多于pattern的长度,这时是肯定无法进行匹配的;
    而对于两个map,如果对应的元素不再map,返回值为0,因此最开始的时或者二者都有新元素未加入到map中时,是不会返回false的。只有二者分别所对应的数字索引不相等时,才会返false。
  • pattern2index[pattern[i]] = i+1;
    str2index[word] = i+1;

    分别对两个map更新字符/字符串——数字所对应的索引表,供之后的遍历使用。
  • return i == n;
    如果最后遍历完成并满足条件的话,i和n应该是相等的;因为也会有那种str的长度仅仅为一个单词的情况而导致输出出现错误,因此需要判断具体的遍历情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值