前端使用JavaScript解决检查字符串是否为数组前缀的算法问题

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

有人相爱,有人夜里开车看海,我是LeetCode第一题都做不出来

检查字符串是否为数组前缀

给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 。

字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的前 kk 为 正数 )个字符串按顺序相连得到,且 k 不超过 words.length 。

如果 s 是 words 的 前缀字符串 ,返回 true ;否则,返回 false 。

示例 1:

输入: s = "iloveleetcode", words = ["i","love","leetcode","apples"]

输出: true

解释:s 可以由 "i"、"love" 和 "leetcode" 相连得到。

示例 2:

输入: s = "iloveleetcode", words = ["apples","i","love","leetcode"]

输出: false

解释:数组的前缀相连无法得到 s 。

解题思路

方法一:

我们可以按顺序遍历 words 中的字符串,并与 s 逐字符比较。如果遇到不同的字符,则返回 false。

同时,根据题意,当且仅当 swords 中任一字符串同时遍历结束时,s 才为 words 的前缀字符串。因此,如果遇到以下两种情况时,也应返回 false:

  • 在未遍历完成 words 的某个字符串时,s 提前遍历完成;

  • 在遍历完成words 的所有字符串后,s 仍未遍历完成。

方法二:

还有另一种比较好的方法就是:初始化一个标志result存放比较结果,再初始化一个空字符串用于存储数组拼接的新字符,遍历words进行拼接,每拼接一次都与s进行比较,如果相同则把result = true并且暂停遍历返回true,遍历到最后如果都不相同就返回false

具体步骤如下:

  • 第一步:初始化一个空字符串newS,一个result = false
  • 第二步:遍历字符串
    • 进行 newS+=words[i]拼接操作,再与s进行比较,如果为true,就令result = true并且终止遍历
  • 返回 比较结果
var isPrefixString = function(s, words) {
    let newS = ''
    let result = false
    for(let i=0;i<words.length;i++){
        newS+=words[i]
        if(newS === s){
            result = true
            return true
        }
    }
    return result
};

image.png