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日

相关文章

  • 2021最新Java JDK1.8的安装超详细教程

    2021最新Java JDK1.8的安装超详细教程 简介 Java JDK是开发和运行Java程序的必备工具。本文将详细介绍如何安装最新版的Java JDK1.8,并包含一些实例,帮助您更好的理解和使用Java JDK。 步骤 步骤1:下载安装包 首先,您需要下载Java JDK1.8的安装包。您可以通过以下链接下载: Java JDK1.8官方下载页面 请…

    Java 2023年5月19日
    00
  • ES6 Generator函数的应用实例分析

    ES6 Generator函数的应用实例分析 什么是Generator函数 Generator函数是ES6引入的一种新的函数类型,可以通过简单的语法来定义一个迭代器,主要用于异步操作或者实现自定义迭代器。 function* generator() { yield 1; yield 2; yield 3; } const g = generator(); /…

    Java 2023年5月26日
    00
  • SpringBoot集成内存数据库Derby的实践

    请看以下攻略: SpringBoot集成内存数据库Derby实践 Apache Derby是基于Java的内存关系型数据库。这篇文章将介绍如何在Spring Boot应用程序中使用Derby,实现内存数据库的集成,以及用于创建表、插入数据以及检索和删除数据的几个简单示例。 集成Derby 要集成Derby,需要添加以下依赖项到pom.xml中: <de…

    Java 2023年5月20日
    00
  • 基于Java的Scoket编程

    下面我将为你详细讲解“基于Java的Socket编程”的完整攻略。 Socket编程简介 Socket编程是指利用Socket套接字来进行网络通信的一种编程方式。在这种编程方式中,一个程序可以充当客户端与远程服务器进行通信,也可以充当服务器同时与多个客户端进行通信。 Socket编程流程 Socket编程的一般流程如下: 创建Socket对象,指定连接的服务…

    Java 2023年5月24日
    00
  • JavaSpringBoot报错“BeanDefinitionStoreException”的原因和处理方法

    原因 “BeanDefinitionStoreException” 错误通常是以下原因引起的: 配置问题:如果您的配置不正确,则可能会出现此错误。在这种情况下,您需要检查您的配置并确保它们正确。 类型不匹配:如果您的代码中存在类型不匹配问题,则可能会出现此错误。在这种情况下,您需要检查您的代码并确保它们正确。 解决办法 以下是解决 “BeanDefiniti…

    Java 2023年5月4日
    00
  • Spring Security自定义认证逻辑实例详解

    接下来我将为你详细讲解“Spring Security自定义认证逻辑实例详解”的完整攻略。 标题 引言 Spring Security是基于Spring框架提供的可以进行认证(authentication)和授权(authorization)的框架。它可以帮助我们快速实现Web应用程序的安全性。 Spring Security内置了多种认证方式,但有时我们需…

    Java 2023年6月3日
    00
  • EasyUI框架 使用Ajax提交注册信息的实现代码

    接下来我将详细讲解“EasyUI框架 使用Ajax提交注册信息的实现代码”的完整攻略。 首先,我们需要在我们的网页中引入EasyUI框架的JavaScript和CSS文件,可以使用以下链接引入: <link rel="stylesheet" type="text/css" href="https://c…

    Java 2023年5月20日
    00
  • Spring Data的Domain Event的用法详解

    标题:Spring Data的Domain Event的用法详解 1. 什么是Domain Event? Domain Event是一种事件机制,它用于处理领域逻辑中的某些事件。在领域驱动设计(DDD)中,事件是指一个领域中发生的事情,比如订单被下单了,支付被成功,等等。使用Domain Event来处理这些事件可以使我们的代码更加高效和简 single-r…

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