代码随想录算法训练营 day10

目录

找出字符串中第一个匹配项的下标

正解:


找出字符串中第一个匹配项的下标

  • 什么是KMP

    • 它是三位学者名字的首字母

  • KMP有什么用

    • 我现在觉得就是查找匹配值的时候可以用

    • 文章说的是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

  • 什么是前缀表

    • 记录了最长相同前后缀的数组

    • 文章说的是KMP里面的next数组就是一个前缀表(prefix table),记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。

  • 为什么一定要用前缀表

    • 前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。

  • 如何计算前缀表

    • 搞清楚前缀和后缀什么意思?

      • 前缀就是尾巴字母的连续字符串

      • 后缀就是脑袋字母的连续字符串

    • 计算方式

      • 比如 'a' 去头计算和去尾计算,都是啥也不剩,所以最长相同前后缀长度:0

      • 比如 'aa' 去头计算和去尾计算,都是只留下一个字母a,所以最长相同前后缀长度:1

      • 比如 'aab' 去头计算和去尾计算,前缀aa && 后缀ab,这里一开始a b都不相同 所以最长相同前后缀长度:0

      • 比如 'aaba' 去头计算和去尾计算,前缀aab && 后缀aba,相同的只有前者的首和后者的尾的字母a,所以最长相同前后缀长度:1

      • 比如 'aabaa' 去头计算和去尾计算,同理可得,最长相同前后缀长度:2

  • 前缀表与next数组

    • 这个数组就用来存放最长相同前后缀的长度

正解:

class Solution {
   public void getNext(int[] next,String s){
             //创建next数组 以及如何为数组添加元素
            int j=-1;//初始化,这个j代表前缀,j初始值-1
            next[0]=j;//这里不用管第一个字母,因为最长相同前后缀等于0
            for(int i=1;i<s.length();i++){
            //i代表后缀,初始化完成
            //回退操作写在循环里面,而不是if语句里面,
            //因为j走到后面,不能只回退一次嘛,它必须在回退的过程中逐一比较,求出最长相同前后缀的值
            while(j>=0 && s.charAt(i) != s.charAt(j+1)){
                    j=next[j];
            }
            if(s.charAt(i) == s.charAt(j+1)){
                j++;
            }
            next[i]=j;
                //相同时,记录j的值到next数组中,然后j i向前移动
                
    }
}    
    public int strStr(String haystack, String needle) {
               int[] next=new int[needle.length()];
               getNext(next,needle);
               int j=-1;
               //i作为下标使用在haystack
               //j作为下标使用在needle
               for(int i=0;i<haystack.length();i++){
                   while(j>=0 && haystack.charAt(i)!=needle.charAt(j+1)){
                       j=next[j];
                   }
                   if(haystack.charAt(i)==needle.charAt(j+1)){
                       j++;
                   }
                   if(j == needle.length()-1)
                   {return i-needle.length()+1;}
               }
               return -1;
            }
    }
​

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值