前端算法(28)

75 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 06 处匹配。
第一个匹配项的下标是 0 ,所以返回 0

题目解析

思路一

var strStr = function(s, p) {
  const sLen = s.length
  const pLen = p.length
  let pNext = 0 // 匹配串末尾的下一个字符
  let i = 0
  let j = 0
  // 序列化匹配串
  let index = 0
  const mapping = {}
  while (index < pLen) {
    mapping[p[index]] = index
    index++
  }
  while (i < sLen && j < pLen) {
    if (s[i] === p[j]) {
      i++
      j++
    } else {
      // s 和 p 失配
      pNext = i - j + pLen
      if (mapping[s[pNext]] !== undefined) {
        //【匹配串末尾的下一个字符】在匹配串中出现过
        i = pNext - mapping[s[pNext]]
      } else {
        // 不在匹配串中,移动到【匹配串的长度 + 1】个长度
        i = pNext + 1
      }
      j = 0
    }
  }
  return j === pLen ? i - j : -1
};

思路二

我们可以遍历haystack数组,找到与needle第一个字符匹配的位置,在记录当前位置,并从当前位置开始,进一步比较needle剩余的字符,当needle所有的字符都匹配上时,返回记录的位置;一旦有某个字符没有匹配上,直接break,跳出本次比较

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    if(needle.length === 0){
        return 0;
    }
    let res = -1;
    for(let i=0;i<haystack.length;i++){
        if(needle.charAt(0) === haystack.charAt(i)){
            let j = 0;
            let index =i;
            let temp = i;
            while(j<needle.length && index<haystack.length){
                if(needle.charAt(j) === haystack.charAt(index)){
                    j++;
                    index++;
                    if(j===needle.length){
                        res = temp;
                        return res;
                    }
                }else{
                    break;
                }
            }
        }
    }
    return res;
};

思路三

首先返回haystack === needle === ''的情况,然后通过循环haystack截取长度等于needle.length的字符串,依次放入数组,通过indexOf判断needle在arr是否存在。

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    if(haystack.length === 0 && needle.length === 0){
        return 0
    }else{
        let arr = []
        for(let i = 0 ; i < haystack.length ; i++){
            arr.push(haystack.substr(i,needle.length))
        }
        return arr.indexOf(needle)
    }
};