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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode 面试题01.09字符串轮赚 -> 正文阅读

[数据结构与算法]leetcode 面试题01.09字符串轮赚

字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

开始打算遍历两个字符串, 越做越麻烦,后来看题解知道应该这么做:“ 首先判断两个字符串长度是否相等,再判断把两个s1连起来能不能包含s2”

package mianshi;

import java.util.Arrays;

/**
 * @ClassName IsFlipedString
 * @Description TODO
 * @Author Achilles
 * @DATE 2021/9/3 16:28
 * @Version 1.0
 */

public class IsFlipedString {
    public boolean isFlipedString(String s1, String s2) {
        if(s1 == null || s2 == null){
            return false;
        }
        if(s1.length() != s2.length()){
            return false;
        }

        String s = s1 + s1;

        int res = kmpIndex(s, s2);
        System.out.println(res);
        return res != -1;
    }

    private int kmpIndex(String s, String t){
        int[] next = getNext(t);
        int i = 0, j = 0;

        while (i < s.length() && j < t.length()){
            if(j == -1 || s.charAt(i)==t.charAt(j)){
                i++;
                j++;
            }
            else {
                j = next[j];
            }
        }
        if(j >= t.length()){
            return (i-t.length());
        }
        else {
            return -1;
        }
    }

    private int[] getNext(String s){
        int[] next = new int[s.length()];
        int j, k;
        j = 0; k = -1;
        next[0] = -1;
        //因为next数组中j最大为t.length-1,而每一步next数组赋值都是在j++之后
        //所以最后一次经过while循环时j为t.length-2
        while (j < s.length()-1){
            if(k == -1 || s.charAt(j) == s.charAt(k)){
                j++; k++;

                if (s.charAt(j)!=s.charAt(k)) {
                    //这里的s.charAt(k)是s.charAt(j)处字符不匹配而会回溯到的字符
                    //为什么?因为没有这处if判断的话,此处代码是next[j]=k;
                    //next[j]不就是s.charAt(j)不匹配时应该回溯到的字符位置嘛
                    next[j] = k;
                }
                else {
                    next[j] = next[k];
                }
                //这一个代码含义是不是呼之欲出了?
                //此时nextval[j]的值就是就是t.data[j]不匹配时应该回溯到的字符的nextval值
                //用较为粗鄙语言表诉:即字符不匹配时回溯两层后对应的字符下标
//                next[j] = k;
                //对应字符匹配情况下,s与t指向同步后移
                //通过字符串"aaaaab"求next数组过程想一下这一步的意义
                //printf("(1) j=%d,k=%d,next[%d]=%d\n",j,k,j,k);
            }else{
                k = next[k];
                //我们现在知道next[k]的值代表的是下标为k的字符前面的字符串最长相等前后缀的长度
                //也表示该处字符不匹配时应该回溯到的字符的下标
                //这个值给k后又进行while循环判断,此时t.data[k]即指最长相等前缀后一个字符**
                //为什么要回退此处进行比较,我们往下接着看。其实原理和上面介绍的KMP原理差不多
                //printf("(2) k=%d\n",k);
            }
        }
        return next;
    }
    public static void main(String[] args) {
        String s1 = "waterbottle";
        String s2 = "erbottlewat";
        boolean res = new IsFlipedString().isFlipedString(s1, s2);
        System.out.println("Res is "+res);



        String s3 = "aaaaab";

        int[] next = new IsFlipedString().getNext(s3);
        System.out.println("Res is "+res);
    }
}

使用kmp来做, kmp:KMP算法的作用是在一个已知字符串中查找子串的位置,也叫做串的模式匹配。

求next的方法:
在这里插入图片描述
优化next的原理:

在这里插入图片描述

kmp算法的学习来源是:
https://blog.csdn.net/weixin_46007276/article/details/104372119?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163090574116780261967375%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163090574116780261967375&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-104372119.pc_search_ecpm_flag&utm_term=kmp&spm=1018.2226.3001.4187

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-07 11:04:32  更:2021-09-07 11:05:31 
 
开发: 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/26 1:48:03-

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