【LeetCode】796. 旋转字符串
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;
}
}
相关题目
相关链接
【LeetCode】796. 旋转字符串的更多相关文章
- Java实现 LeetCode 796 旋转字符串 (水题)
796. 旋转字符串 给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转 ...
- LeetCode 简单 -旋转字符串(796)
给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...
- leetcode.769旋转字符串
给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...
- 力扣(LeetCode)旋转字符串 个人题解
给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' .如果在若干次旋转操作之后,A 能变成B ...
- leetcode题库练习_左旋转字符串
题目:左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返 ...
- 剑指Offer面试题:34.翻转单词顺序VS左旋转字符串
一.题目一:翻转单词顺序 1.1 题目说明 题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a st ...
- 【面试题042】翻转单词顺序VS左旋转字符串
[面试题042]翻转单词顺序VS左旋转字符串 题目一: 输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I a ...
- lintcode :旋转字符串
题目: 旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdef ...
- 九度OJ 1362 左旋转字符串(Move!Move!!Move!!!)【算法】
题目地址:http://ac.jobdu.com/problem.php?pid=1362 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运 ...
随机推荐
- Java:java获取Linux下的路径
指定Linux的路径 //Linux系统路径 StringBuilder sb = new StringBuilder(File.separator); String Url = sb.append( ...
- SpringBoot中如何监听两个不同源的RabbitMQ消息队列
spring-boot如何配置监听两个不同的RabbitMQ 由于前段时间在公司开发过程中碰到了一个问题,需要同时监听两个不同的rabbitMq,但是之前没有同时监听两个RabbitMq的情况,因此在 ...
- so层反调试方法以及部分反反调试的方法
1.检测ida远程调试所占的常用端口23946,是否被占用 //检测idaserver是否占用了23946端口 void CheckPort23946ByTcp() { FILE* pfile=NUL ...
- Acunetix敏感的数据泄露–泄露如何发生
术语"敏感数据暴露"是指允许未授权方访问存储或传输的敏感信息,例如信用卡号或密码.全球范围内大多数重大安全漏洞都会导致某种敏感的数据泄露. Acunetix利用攻击漏洞(例如Web ...
- oracle 大表在线删除列操作(alter table table_name set unused )
在某些情况下业务建的表某些列没有用到,需要进行删除,但是如果是数据量很大的大表,直接 alter table table_name drop column column_name;这种方法删除,那么将 ...
- MySQL基础篇(一)
本文主要内容为MySQL的基础语句以及正则表达式等内容. 本文操作的数据库内容存在个人github:https://github.com/YuanGao-1/blog_demo.git init_sc ...
- CentOS7创建个人系统启动服务项的方法
CentOS7.6自定义系统启动项的方法(类似busybox里面的inittab)1.编写属于自己的unit服务文件,命令为my.service[Unit]Description=My-demo Se ...
- 动静态web项目(三)
在Eclipse中将web项目分为了Dynamic Web Project和Static Web Project. 那么这两种有什么区别呢? 其实这里的Dynamic和Static是通过页面来区分的. ...
- java 8内置的四大核心函数式接口
Consumer<T> : 消费性接口 返回值 void accept(T t); public void happy(double money, Consumer<Double& ...
- python里面的多进程实例
python执行多任务方式:python语言中实现多任务的方式有三种:线程,进程和协程 一.python多进程: multiprocessing 概念:Python提供了非常好用的多进 ...