2021-02-12:如何判断两个字符串是否互为旋转字符串

作者:神秘网友 发布时间:2021-02-12 19:20:05

2021-02-12:如何判断两个字符串是否互为旋转字符串

2021-02-12:如何判断两个字符串是否互为旋转字符串

福哥答案2021-02-12:

假设字符串str1是“ABCDE”,字符串str2是“CDEAB”。字符串str2可以拆分成“CDE”和“AB”,可以拼成“ABCDE”。所以str1和str2互为旋转字符串。

解法:
1.判断str1和str2的字符串长度是否相等。不等返回false;相等进行下一步。
2.设str=str1+str1,判断str是否包含str2。如果包含,是旋转字符串。如果不包含,说明不是旋转字符串。
字符串是否包含子字符串,可以用相应语言的系统自带函数,也可以用kmp算法。

代码用golang编写,代码如下:

package main

import (
    "fmt"
    "strings"
)

func main() {
    str1 := "ABCDE"
    str2 := "CDEAB"
    ret := rotateString1(str1, str2)
    fmt.Println("1.系统自带函数:", ret)
    ret = rotateString2(str1, str2)
    fmt.Println("2.kmp算法:", ret)
}

//1.系统自带函数
func rotateString1(A string, B string) bool {
    return len(A) == len(B)  strings.Contains(A+A, B)
}

//2.kmp算法
func rotateString2(A string, B string) bool {
    return len(A) == len(B)  kmp(A+A, B) = 0
}

func kmp(s string, m string) int {
    sLen := len(s)
    mLen := len(m)
    if sLen  mLen {
        return -1
    }
    if mLen == 0 {
        return 0
    }
    next := getNextArray(m)
    x := 0
    y := 0
    for x  sLen  y  mLen {
        if s[x] == m[y] {
            x++
            y++
        } else if y  0 {
            y = next[y]
        } else {
            x++
        }
    }
    if y == mLen {
        return x - y
    } else {
        return -1
    }
}

func getNextArray(m string) []int {
    mLen := len(m)
    if mLen == 1 {
        return []int{-1}
    }
    next := make([]int, mLen)
    next[0] = -1
    cn := 0
    for i := 2; i  mLen; i++ {
        if m[i-1] == m[cn] {
            cn++
            next[i] = cn
            i++
        } else if cn  0 {
            cn = next[cn]
        } else {
            i++
        }
    }
    return next
}

  

执行结果如下:

***
[力扣796.旋转字符串](https://leetcode-cn.com/problems/rotate-string/)
[评论](https://user.qzone.qq.com/3182319461/blog/1613086311)

2021-02-12:如何判断两个字符串是否互为旋转字符串 相关文章

  1. C#如何屏蔽程序的多次启动

    先解释一下需求,假如我们开发了一个程序叫做QQ.exe,在QQ.exe启动之后,我们不允许QQ.exe再次启动,那么我们该如何做呢 下面我们用一个很简单的程序模拟QQ.exe来实现这个需求。 启动VS创建一个控制台应用程序,编辑如下代码: 1 using System.Runtime.InteropS

  2. php如何控制循环执行的时间

    我们在循环执行某个程序时,可能会出现超时导致程序死掉的情况。所以我们有必要限制每个循环执行的最长时间,以此来避免程序死掉的情况。 如果超时,则直接断开改进程,并继续下一层循环操作。携程,多线程都可以完成该操作,但在没有了解这些高深技术的时候

  3. php如何解决跨域问题

    什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。 所谓同源是指,域名,协议,端口均相同。 1、允许所有域名访问 header(Access-Control-Allow-Origin: *); 2、允许单个域名访问 header(Acc

  4. 1028 人口普查 (20 分)

    在读入日期时判断该日期是否在合法日期的区间内,如果在,就使其更新最年长的人的出生日期和最年轻的人的出生日期。由于判断日期是否在合法日期区间 内、更新最年长和最年轻的信息都将涉及日期的比较操作,因此不妨写两个比较函数用来比较a与b的日期。 ps:

  5. 如何使用一个域名配置多个Laravel项目

    每天进步一点点... 这是自己在学习过程中遇到的一个问题。申请了一个二级域名(api.demo.com),想实现(api.demo.com/blog)就是我博客项目,(api.demo.com/test)就是我测试项目,奈何技术有限,又是首次接触nginx,捣鼓了很久才弄好。 我用的是宝塔面板

  6. C++ 判断浮点数是否为Nan值

    参考链接: C++ Nan() NaN means “not a number,” and is used for floating point operations.? There are lots of floating point operations that don’t make sense, such as dividing by zero, taking the log of zero or a negative number, taking

  7. Linux下如何安装mysql

    下载: wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar 解压: tar xf MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar 安装: yum install -y *.rpm 默认安装位置:/var/lib/mysql,需要自己设定安装位置就得修改配置

  8. Python:装饰器是如何调用的

    应用举例: (1)装饰器 # 装饰器的调用:# 一旦用上装饰器会: # 第一步:调outer函数# 第二步:被装饰的函数play_game会被当作参数fn给outer# 第三步:最后调用play_game时,对应的是outer函数中的返回值:retrun innerdef outer(fn): print('我是外部函数

  9. 教你如何做才能使宝塔防篡改

    下面由 宝塔面板 教程栏目给大家介绍宝塔防篡改使用教程,希望对需要的朋友有所帮助! 宝塔防篡改使用教程 1、添加保护目录(添加后默认保护目录下所有受保护的文件) 2、查看项目列表 开机启动:默认关闭,且修改任意配置后关闭,需先开启防篡改开关确认无误

  10. php如何获取私有属性的值

    最近要导入一下数据,要把一个项目的部分数据导入到另一个项目中 采用laravel的chunkById段落查询方法,一次查询2K,然后批量入库,由于这个表没啥改动,可以直接查询后导入 遇到的问题是,查询后的数据属性是一个数组,要手动组装下才能直接入库,字段有点

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词