代码随想录算法训练营第九天| 28.实现strStr()、459.重复的子字符串、字符串总结

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;
};

总结

等二刷等二刷。


 字符串总结

代码随想录字符串总结

总结

  1. 打基础的时候不要太迷恋于库函数;
  2. 如果题目的关键部分能用库函数直接解决,那就不要使用库函数;
  3. 如果库函数只是解题过程中的一小部分,并且清楚原理,那可以使用;
  4. 双指针是字符串处理的常客,KMP是字符串查找最重要的算法。
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值