代码随想录day9 - 字符串(下)

65 阅读1分钟

28. 实现 strStr()

力扣题目链接

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2

示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1

解题思路

  1. 初始思路

类似于双指针法,用i遍历haystack数组,当haystack[i]===needle[0]时,记录下来当前的索引值res=i,同时用j遍历needle数组,i,j走相同步幅:如果最后j遍历完needle,那么说明字符串中有该匹配项,返回res;如果中途出现 haystack[i]!==needle[j],那么,此时将 i 复位为刚刚haystack[i]===needle[0] 的 res +1,再重复上面的判断逻辑

var strStr = function(haystack, needle) {
    let m = haystack.length
    let n = needle.length
    if(m<n) return -1

    let res 
    for(let i=0;i<m;){
        if(haystack[i] === needle[0]){
            res = i
            let j
            for(j=0;j<n;){
                // console.log(i,haystack[i],j,needle[j])
                if(haystack[i]===needle[j] ){
                    i++
                    j++
                }else{
                    i = res + 1
                    res = -1
                    break
                }
            }
            // console.log(j,n,res)
            if(j==n){
                // console.log('fuck',res)
                return res
            }
        }else{i++}
    }
    return -1
};
  1. KMP

459.重复的子字符串

力扣题目链接(opens new window)

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。

示例 2:
输入: "aba"
输出: False

示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

解题思路

  1. 使用库函数取巧

判断字符串s是否有重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是又重复子串组成。 同时,刨除原有的s,要去除首字符和尾字符。

var repeatedSubstringPattern = function(s) {
    let n =  (s+s).slice(1,-1)
    return n.includes(s)
};
  1. KMP

关于2 题的 KMP实现另写一专题.. 不拖了,赶进度