IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> kmp算法匹配字符串 -> 正文阅读

[数据结构与算法]kmp算法匹配字符串

搞懂kmp算法next数组的原理后,自己写了主函数匹配字符串,ac了,个人还是比较喜欢从0开始而不是从-1开始,以后就选从0开始的方法了。

https://leetcode-cn.com/problems/implement-strstr/

class Solution {
    public int strStr(String haystack, String needle) {
        int[] next = new int[needle.length()];
        if(needle.length() == 0) return 0;
        char[] need = needle.toCharArray();
        char[] hay = haystack.toCharArray();
        getNext(next,need);
        int j = 0;
        for(int i = 0; i < haystack.length();i++) {
            //开始匹配主串,如果相等j++
            if(hay[i] == need[j]) {
                j++;
            }else {
                //不相等的话,根据next数组的值,将j回退到模式串对应位置,由于for循环会i++,然而我们要重新匹配一次这个位置,所以在这个条件下i--;
                if(j > 0) {
                    j = next[j - 1];
                    i--;
                }
            }
            if(j == needle.length()) return i - j + 1;
        }
        return -1;

    }

    public void getNext(int[] next,char[] s) {
        //初始化next数组
        int j = 0;
        next[0] = j;
        //后缀从1开始扫描整个模式串
        for(int i = 1; i < s.length;i++){
            //如果前后缀不相同,next数组就回退到上一个前后缀都相同的位置,其实就是确保接下来接住的位置的后缀正好等于主串的前缀,所以才能接上
            while(j > 0 && s[i] != s[j]){
                j = next[j - 1];
            }
            //如果相同j就前移一位,而且这个位置的next数组的值就是j
            if(s[i] == s[j]){
                j++;
            }
            next[i] = j;
        }
    }
}

next数组用了动态规划的思想,我还没有集中练习动态规划,等多练一些动态规划的题可能对这个理解就更深了。


!!!对比了一下代码随想录的主函数,我发现调换主函数的情况处理,代码上简洁一些了,贴上来码着

public int strStr(String haystack, String needle) {
        int[] next = new int[needle.length()];
        if(needle.length() == 0) return 0;
        char[] need = needle.toCharArray();
        char[] hay = haystack.toCharArray();
        getNext(next,need);
        int j = 0;
        for(int i = 0; i < haystack.length();i++) {
            //优先处理不匹配的情况,让模式串指针j回退,如果j = 0,即还在第一位就略过,继续扫
            while(j > 0 && hay[i] != need[j]){
                j = next[j - 1];
            }
            //直到从模式串开头匹配或者字符匹配了,j++
            if(hay[i] == need[j]) j++;
            if(j == needle.length()) return i - j + 1;
        }
        return -1;

    }

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:44:57  更:2021-07-24 11:46:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:22:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码