796. 旋转字符串

知识点:字符串;KMP算法

题目描述

给定两个字符串, A 和 B。

A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。

示例
示例 1:
输入: A = 'abcde', B = 'cdeab'
输出: true 示例 2:
输入: A = 'abcde', B = 'abced'
输出: false

解法一:暴力法

依次后移依次比较

class Solution {
public boolean rotateString(String s, String goal) {
if(s.length() != goal.length()) return false;
if(s.length() == 0) return true;
search:
for(int i = 0; i < s.length(); i++){ //旋转的次数;
for(int j = 0; j < goal.length(); j++){
if(s.charAt((i+j) % s.length())!= goal.charAt(j)){
continue search; //匹配不上直接比较下一次旋转;
}
}
return true;
}
return false;
}
}

解法二:API

其实A+A里就包含了所有A进行旋转的结果,所以只要判断B是否是A的子串就可以了,而String类含有contains方法;

class Solution {
public boolean rotateString(String s, String goal) {
return (s.length() == goal.length()) && ((s+s).contains(goal));
}
}

解法三:KMP算法

按照上面的分析,如果把A拓展成为A+A,那这道问题就变成了在A+A中是否含有B的子串,这是经典的字符串匹配问题,最经典的当属于KMP算法。

class Solution {
public boolean rotateString(String s, String goal) {
int n = goal.length();
int[] next = buildNext(goal, n);
if(s.length() != goal.length()) return false;
int i = 0;
int now = 0;
String news = s+s;
while(i < news.length()){
if(news.charAt(i) == goal.charAt(now)){
i++;
now++;
}else if(now != 0){
now = next[now-1];
}else{
i++;
}
if(now == goal.length()){
return true;
}
}
return false;
}
private int[] buildNext(String str, int n){
int[] next = new int[n];
int now = 0;
int i = 1;
while(i < n){
if(str.charAt(i) == str.charAt(now)){
now++;
next[i] = now;
i++;
}else if(now != 0){
now = next[now-1];
}else{
next[i] = 0;
i++;
}
}
return next;
}
}

相关题目

28. 实现 strStr()

相关链接

KMP算法

【LeetCode】796. 旋转字符串的更多相关文章

  1. Java实现 LeetCode 796 旋转字符串 (水题)

    796. 旋转字符串 给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转 ...

  2. LeetCode 简单 -旋转字符串(796)

    给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...

  3. leetcode.769旋转字符串

    给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...

  4. 力扣(LeetCode)旋转字符串 个人题解

    给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...

  5. leetcode题库练习_左旋转字符串

    题目:左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返 ...

  6. 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串

    一.题目一:翻转单词顺序 1.1 题目说明 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...

  7. 【面试题042】翻转单词顺序VS左旋转字符串

    [面试题042]翻转单词顺序VS左旋转字符串 题目一:     输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.     例如输入字符串“I a ...

  8. lintcode :旋转字符串

    题目: 旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdef ...

  9. 九度OJ 1362 左旋转字符串(Move!Move!!Move!!!)【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1362 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运 ...

随机推荐

  1. 【spring源码系列】之【Bean的属性赋值】

    每次进入源码的世界,就像完成一场奇妙的旅行! 1. 属性赋值概述 上一篇讲述了bean实例化中的创建实例过程,实例化后就需要对类中的属性进行依赖注入操作,本篇将重点分析属性赋值相关流程.其中属性赋值, ...

  2. Docker中容器的备份和恢复(可迁移)

    官方文档 备份容器 - save 查看镜像$ docker images 容器快照 - commit$ docker commit CONTAINER xxx/exampleimage-backup: ...

  3. CentOS-Docker搭建MinIO(单点)

    下载镜像 $ docker pull minio/minio 创建相关目录 $ mkdir /home/minio/data /home/minio/config -p 运行镜像(自定义Access和 ...

  4. CentOS-Docker搭建VeryNginx

    下载镜像 $ docker pull camil/verynginx $ cd /home GIT克隆(yum install git -y) $ git clone https://github.c ...

  5. SpringMVC(10)实现注解式权限验证

    在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的.那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容->异 ...

  6. 学习/etc/group /etc/passwd 和 /etc/shadow

    /etc/passwd 管理用户信息的系统文件 /etc/shadow 管理用户密码信息的系统文件 /etc/group 管理用户组信息的系统文件 1./etc/group 将用户分组是Linux系统 ...

  7. STM32学习进程

    新建一个自己的工程模板,以我所用的MDK4为例 MDK4软件图标 (1)新建一个自己储存数据的文件夹.以我自己为例(文件夹名字任取自己记住熟悉就行,以下将以我的文件夹文件进行操作讲解) 新建的总体文件 ...

  8. [刘阳Java]_CSS数字分页效果

    先给出效果图,见下图.下图主要的完成当鼠标放到分页数字的上会呈现一个变大的效果 实现思路: (1). 使用浮动属性,以便让li元素水平排列. (2).将a元素设置为块级元素,然后设置它们的尺寸. (3 ...

  9. org.apache.maven.archiver.mavenarchiver.getmanifest怎么解决——原因就是你的maven的配置文件不是最新的

    转载:https://www.cnblogs.com/flytop/p/8933728.html原因就是你的maven的配置文件不是最新的 1.help ->Install New Softwa ...

  10. C++:数据类型

    /** * C++ 数据类型 : https://www.runoob.com/cplusplus/cpp-data-types.html * * 布尔: bool * 字符: char 1 个字节 ...