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日

相关文章

  • 困扰JSP的一些问题与解决方法

    困扰JSP的一些问题与解决方法 问题1:JSP页面不显示预期结果 当JSP页面不显示预期结果时,可能存在以下原因: 脚本语言引擎问题:语法错误或者未正确引入脚本语言。可以通过查看控制台输出或者检查JSP页面中脚本语言的引入是否正确来解决。 语法错误:JSP页面中可能存在语法错误,例如拼写错误、标签使用不当等。可以通过各种文本编辑器或者开发工具的语法检查功能来…

    Java 2023年6月15日
    00
  • java字符转码的三种方法总结及实例

    它们是: Java字符转码的三种方法总结及实例 在Java编程中,处理字符编码转换是常见的任务。不正确或不一致的字符编码转换可能导致各种问题,例如乱码、字符截断或不完整等等。因此,我们必须正确、准确地处理字符编码转换。本文将介绍3种常用的Java字符转码方法,并提供相关示例以方便理解和实践。 1. 使用Java内置的Charset类 该方法主要利用了Java…

    Java 2023年5月20日
    00
  • PHP+JS实现批量删除数据功能示例

    下面是详细的“PHP+JS实现批量删除数据功能示例”的完整攻略。 第一步:分析需求并准备工作 在实现批量删除数据功能前,我们需要分析一下需求。批量删除数据功能是指可以同时删除多条数据,而不需要逐个删除,这样可以提高操作效率。具体实现步骤如下: 准备工作: 编写HTML页面,包括显示数据部分和删除数据部分。 编写PHP程序,用于实现从数据库中获取数据,将数据传…

    Java 2023年6月15日
    00
  • 详解SpringBoot中使用JPA作为数据持久化框架

    下面为您详细讲解SpringBoot中使用JPA作为数据持久化框架的完整攻略。 1. JPA简介 JPA(Java Persistence API)是JavaEE标准的ORM(对象关系映射)规范,它提供了一种简化了的操作数据库的方式,将Java对象映射到关系型数据库,实现Java程序与数据库的隔离。JPA的实现包括Hibernate、EclipseLink等…

    Java 2023年5月20日
    00
  • Spring项目运行依赖spring-contex解析

    Spring框架是个非常流行的Java开发框架,它通过使用依赖注入和面向切面编程等技术来简化Java开发过程。在Spring框架中,spring-context模块是一个非常重要的模块,它提供了一些关键的功能,如依赖注入、AOP和Java EE集成等。在本文中,我们将提供一份完整攻略,从基础到深入,让你了解Spring项目在运行中依赖spring-conte…

    Java 2023年5月20日
    00
  • Spring Boot 连接LDAP的方法

    Spring Boot连接LDAP的方法 LDAP(Lightweight Directory Access Protocol)是一种轻量级的目录访问协议,常用于企业级应用程序中的身份验证和授权。在Spring Boot中,我们可以使用Spring LDAP来连接和操作LDAP服务器。本文将详细讲解如何使用Spring LDAP连接LDAP服务器,并提供两个…

    Java 2023年5月15日
    00
  • Java实体类(entity)作用说明

    首先来讲解一下什么是Java实体类。 Java实体类(Entity)作用说明 Java实体类是一种Java类,用于表示业务模型中的数据对象。在Java开发中,除了程序中使用的基本类型和预定义类型外,一般会自定义一些类用于表示具体的数据对象,比如用户、订单等。此时需要使用Java实体类来对数据进行结构化描述和封装。Java实体类通常包含了字段和相应的get/s…

    Java 2023年5月26日
    00
  • xml+php动态载入与分页

    下面我将详细讲解 “XML+PHP动态载入与分页” 的实现过程。 什么是XML+PHP动态载入与分页? XML+PHP动态载入与分页是一种网站动态载入和分页内容的技术,它可以帮助网站实现异步加载、无刷新加载和分页加载等功能。在这种技术中,我们将数据存储在XML文件中,通过PHP程序实现读取和处理XML数据,并通过Ajax技术进行实时载入数据,从而实现网页内容…

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