力扣题解 第6期:1078. Bigram 分词

1,893 阅读1分钟

1078. Bigram 分词

1、题干

给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。

对于每种这样的情况,将第三个词 "third" 添加到答案中,并返回答案。

示例 1:

输入: text = "alice is a good girl she is a good student", first = "a", second = "good"
输出: ["girl","student"]

示例 2:

输入: text = "we will we will rock you", first = "we", second = "will"
输出: ["we","rock"]

提示:

  • 1 <= text.length <= 1000
  • text 由小写英文字母和空格组成
  • text 中的所有单词之间都由 单个空格字符 分隔
  • 1 <= first.length, second.length <= 10
  • first 和 second 由小写英文字母组成

2、解题思路

  • 正则:使用正则表达式匹配满足条件的单词即可
    • 代码最少,但要注意处理好单词边界(\b
  • 拆分数组:将字符串按空格拆分为字符串数组,遍历并判断连续的两个单词是否符合条件即可
    • 逻辑简单易懂,坑比较少
  • 直接遍历:以空格为标识,判断已遍历的单词数量、以及是否跟 first second相等即可
    • 代码略多,边界情况较多,容易踩坑

3、代码1 - 正则

var findOcurrences = function (text, first, second) {
    return text.match(new RegExp(`(?<=\\b${first} ${second} )[a-z]+`, 'g')) || [];
};

4、代码2 - 拆分数组

var findOcurrences = function (text, first, second) {
    const words = text.split(' ');
    return words.reduce((acc, cur, i) => {
        if (cur === second && words[i - 1] === first && words[i + 1]) acc.push(words[i + 1]);
        return acc;
    }, []);
};

5、代码3 - 直接遍历

var findOcurrences = function (text, first, second) {
    let word = '', found = 0, res = [];
    for (let i = 0; i < text.length; i++) {
        if (text[i] !== ' ') {
            word += text[i];
            if (i < text.length - 1) continue;
        }
        if (found === 2) res.push(word), found = word === second && word === first ? 2 : (word === first ? 1 : 0);
        else if (found === 1) found = word === second ? 2 : (word === first ? 1 : 0);
        else if (found === 0) found = word === first ? 1 : 0;
        word = '';
    }

    return res;
};

执行结果

1.png

原题链接:leetcode-cn.com/problems/oc…