28. 实现 strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2
示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -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
};
- KMP
459.重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
解题思路
- 使用库函数取巧
判断字符串s是否有重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是又重复子串组成。 同时,刨除原有的s,要去除首字符和尾字符。
var repeatedSubstringPattern = function(s) {
let n = (s+s).slice(1,-1)
return n.includes(s)
};
- KMP
关于2 题的 KMP实现另写一专题.. 不拖了,赶进度