Java C++题解leetcode字符串轮转KMP算法详解

Java C++题解leetcode字符串轮转KMP算法详解

1. 题目描述

给定两个字符串s1和s2,判断s2是否可以通过将s1中的某个子串移动后得到。

2. 思路分析

2.1 暴力枚举

我们可以将s1分为两段,任选一段放到另一段的前面,再判断是否与s2相等,如此循环往复。但是这样的时间复杂度为$O(n^2)$。

2.2 KMP算法

我们可以利用KMP算法来解决该问题,KMP算法是一种字符串匹配算法。我们可以将s1与s2进行拼接,判断s1+s1是否包含s2子串即可。

3. 代码实现

3.1 暴力枚举

class Solution {
    public boolean isFlipedString(String s1, String s2) {
        if (s1 == null || s2 == null) return false;
        if (s1.length() != s2.length()) return false;
        if (s1.equals(s2)) return true;
        for (int i = 1; i < s1.length(); i++) {
            String s = s1.substring(i) + s1.substring(0, i);
            if (s.equals(s2)) return true;
        }
        return false;
    }
}
class Solution {
public:
    bool isFlipedString(string s1, string s2) {
        if (s1.size() != s2.size()) return false;
        if (s1 == s2) return true;
        for (int i = 1; i < s1.size(); i++) {
            string s = s1.substr(i) + s1.substr(0, i);
            if (s == s2) return true;
        }
        return false;
    }
};

3.2 KMP算法

class Solution {
    public boolean isFlipedString(String s1, String s2) {
        if (s1 == null || s2 == null) return false;
        if (s1.length() != s2.length()) return false;
        return (s1 + s1).indexOf(s2) != -1;
    }
}
class Solution {
public:
    bool isFlipedString(string s1, string s2) {
        if (s1.size() != s2.size()) return false;
        return (s1 + s1).find(s2) != string::npos;
    }
};

4. 测试样例

输入: s1 = "waterbottle", s2 = "erbottlewat"
输出: true

输入:s1 = "abcde", s2 = "cdeab"
输出:true

以上两组测试数据分别证明了暴力枚举和KMP算法的正确性,并且KMP算法的时间复杂度更小。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++题解leetcode字符串轮转KMP算法详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JAVA函数的定义、使用方法实例分析

    JAVA函数的定义、使用方法实例分析 函数的定义 在JAVA中,函数也称为方法(Method),是程序中一个可以被重复使用的代码块。它可以接受一些输入(参数)并根据这些输入进行一些操作,然后产生输出。在JAVA中,函数定义的一般格式为: 访问修饰符 返回值类型 方法名(参数列表) { 方法体 return 返回值; } 访问修饰符:指定函数可以被哪些代码访问…

    Java 2023年5月26日
    00
  • 关于java命令的本质逻辑揭秘过程

    关于 Java 命令的本质逻辑揭秘过程 Java 命令是用于启动 Java 应用程序的命令行工具,它具有很多可选项和参数,让你可以控制不同方面的应用程序行为。在深入探究 Java 命令的本质逻辑之前,首先需要了解 Java 应用程序的基本结构和运行方式。 Java 应用程序的基本结构 Java 应用程序的基本结构通常由以下三个部分组成: 包声明:一般位于 J…

    Java 2023年5月23日
    00
  • Java面试经验+最新BAT面试资料分享给大家(小结)

    Java面试经验+最新BAT面试资料分享给大家(小结) 这篇文章将帮助大家准备BAT公司的Java面试,希望对大家有所帮助。 程序员面试的模式 程序员面试一般分为以下几轮: 简历筛选 笔试 技术面试 综合素质面试 HR面试 针对每一轮面试,我们都需要做好充足的准备。 简历筛选 在简历筛选阶段,我们需要注意以下几个点: 简历的格式需要清晰简洁,突出重点 突出自…

    Java 2023年5月20日
    00
  • JAVA创建和销毁对象的方法

    下面是关于JAVA创建和销毁对象的方法的详细攻略: 一、对象创建方法 对象的创建可以使用“new”关键字来实现。具体方法如下: 1.1 声明对象 首先需要声明一个类,并指定该类的数据类型。例如: public class Person { private String name; private int age; public Person(String n…

    Java 2023年5月26日
    00
  • 使用docker部署spring boot并接入skywalking的方法

    一、使用Docker部署Spring Boot 首先我们需要在本地编写好Spring Boot应用程序,并使用Maven或Gradle构建出打包好的jar包。 编写Dockerfile文件,用于构建Docker镜像。具体内容可以参考下面的示例: FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY …

    Java 2023年5月20日
    00
  • 详解Tomcat常用的过滤器

    详解Tomcat常用的过滤器 Tomcat中的过滤器可以在请求被目标servlet或JSP之前或之后执行某些操作,如修改请求、响应或扩展请求所需的功能。在Web开发中,常用的过滤器有字符编码过滤器、登录验证过滤器、权限控制过滤器等。下面将详细介绍常用的Tomcat过滤器。 字符编码过滤器 字符编码过滤器可以设置HttpServletRequest和HttpS…

    Java 2023年5月20日
    00
  • Jsp生成页面验证码的方法[附代码]

    让我来详细讲解一下“Jsp生成页面验证码的方法[附代码]”。 1. 简介 验证码(Captcha)是一种常见的图形验证码,用于防止恶意攻击和自动化机器人下载。在 JSP 网站设计的过程中,JavaWeb 的技术基本上都使用了验证码,验证方式很多,确保了 JSP 网站的安全性和性能。 2. 生成验证码示例 下面是一个简单的 JSP 页面,展示了如何使用 Jav…

    Java 2023年6月15日
    00
  • Spring Boot Thymeleaf实现国际化的方法详解

    在Spring Boot应用程序中,我们可以使用Thymeleaf模板引擎来实现国际化。Thymeleaf提供了一种简单而有效的方式来处理多语言文本,它可以根据用户的语言环境自动选择正确的文本。在本文中,我们将详细讲解Spring Boot Thymeleaf实现国际化的方法。 配置文件 在Spring Boot应用程序中,我们可以使用配置文件来定义多语言文…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部