28.实现strStr()
题目链接:28.实现strStr()
文档讲解:代码随想录/实现strStr()
视频讲解:视频讲解-实现strStr()
状态:已完成(1遍)
解题过程
看到题目的第一想法
我的第一想法是来个for循环,遍历到每一个字母就slice一段字符串出来看看是否和要找的字符串一样。如果一样,直接break,最后输出结果。
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
let ans = -1;
let longLen =haystack.length,shortLen = needle.length;
for(let i = 0;i<longLen-shortLen+1;i++){
if(haystack.slice(i,i+shortLen)==needle){
ans = i;
break;
}
}
return ans;
};
提交没有问题,来看看代码随想录怎么说。
看完代码随想录之后的想法
KMP算法,Carl哥让初学者一刷别去理解,学完一遍算法再来看哈哈,确实对这个next数组理解不到位,等二刷再来硬啃!
讲解算法如下:
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function (haystack, needle) {
if (needle.length === 0)
return 0;
const getNext = (needle) => {
let next = [];
let j = -1;
next.push(j);
for (let i = 1; i < needle.length; ++i) {
while (j >= 0 && needle[i] !== needle[j + 1])
j = next[j];
if (needle[i] === needle[j + 1])
j++;
next.push(j);
}
return next;
}
let next = getNext(needle);
let j = -1;
for (let i = 0; i < haystack.length; ++i) {
while (j >= 0 && haystack[i] !== needle[j + 1])
j = next[j];
if (haystack[i] === needle[j + 1])
j++;
if (j === needle.length - 1)
return (i - needle.length + 1);
}
return -1;
};
总结
留个flag,二刷再来研究KMP。
459.重复的子字符串
题目链接:459.重复的子字符串
文档讲解:代码随想录/重复的子字符串
视频讲解:视频讲解-重复的子字符串
状态:已完成(1遍)
解题过程
看到题目的第一想法
这道题算是没第一想法了,等二刷再来研究KMP了。
看完代码随想录之后的想法
讲解代码如下:
/**
* @param {string} s
* @return {boolean}
*/
var repeatedSubstringPattern = function (s) {
if (s.length === 0)
return false;
const getNext = (s) => {
let next = [];
let j = -1;
next.push(j);
for (let i = 1; i < s.length; ++i) {
while (j >= 0 && s[i] !== s[j + 1])
j = next[j];
if (s[i] === s[j + 1])
j++;
next.push(j);
}
return next;
}
let next = getNext(s);
if (next[next.length - 1] !== -1 && s.length % (s.length - (next[next.length - 1] + 1)) === 0)
return true;
return false;
};
总结
等二刷等二刷。
字符串总结
总结
- 打基础的时候不要太迷恋于库函数;
- 如果题目的关键部分能用库函数直接解决,那就不要使用库函数;
- 如果库函数只是解题过程中的一小部分,并且清楚原理,那可以使用;
- 双指针是字符串处理的常客,KMP是字符串查找最重要的算法。