LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创
在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,《终身成长》和《禅与摩托车维修艺术》,值得好好阅读和反复阅读。
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是796)。给定两个字符串A和B,在A上进行移位操作,规则是将A最左边的字符移动到最右边去。例如,如果A ='abcde',那么在A上移位一次后,它将是'bcdea'。当且仅当A在A上移位一定次数后可以变为B时返回True。例如:
输入:A ='abcde',B ='cdeab'
输出:true
输入:A ='abcde',B ='abced'
输出:false
注意:A和B的长度最多为100。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
暴力解法。
特殊情况:如果A本身就和B相等,直接返回true,不需要对A进行移位。
正常情况:每次对A进行移位一次后得到新的字符串,判断是否和B相等,使用一个辅助方法来完成移位操作。先将A转为字符数组arr,然后创建一个新的字符数组arr2,两字符数组长度一致,遍历arr(从第二个元素开始遍历)中的元素,添加进arr2中去(从第一位开添加),遍历结束后,将arr的第一位元素赋值给arr2的最后一位元素,返回以arr2为基础创建的新字符串,判断是否和B相等。
public boolean rotateString(String A, String B) {
if (A.equals(B)) {
return true;
}
int n = A.length();
for (int i=0; i<n; i++) {
A = rotate(A);
if (A.equals(B)) {
return true;
}
}
return false;
}
/**
* 对A进行移位,将字符串第一个字符放到最后去
* @param A
* @return
*/
public String rotate(String A) {
int n = A.length();
char[] arr = A.toCharArray();
char[] arr2 = new char[n];
int index = 0;
for (int i=1; i<n; i++) {
arr2[index++] = arr[i];
}
arr2[index] = arr[0];
return new String(arr2);
}
03 第二种解法
也可以使用字符串截取的方式来解题。
public boolean rotateString2(String A, String B) {
if (A.equals(B)) {
return true;
}
int n = A.length();
for (int i=0; i<n; i++) {
A = A.substring(1, n) + A.substring(0, 1);
if (A.equals(B)) {
return true;
}
}
return false;
}
04 第三种解法
还可以一行代码搞定。思路是子字符串查找,如果B真的可以通过A移位几次后得到,那么在连续两个A组成的字符串中,肯定会存在一个子串等于B。以题目的示例1为例子,字符串"abcdeabcde"中存在一个子串"cdeab"。
public boolean rotateString3(String A, String B) {
return A.equals(B) || (A.length() == B.length() && (A+A).indexOf(B) >= 0);
}
05 第四种解法
还可以通过KMP算法来解,此解法来自于官方。传送门:https://leetcode.com/problems/rotate-string/solution/
public boolean rotateString(String A, String B) {
int N = A.length();
if (N != B.length()) return false;
if (N == 0) return true;
//Compute shift table
int[] shifts = new int[N+1];
Arrays.fill(shifts, 1);
int left = -1;
for (int right = 0; right < N; ++right) {
while (left >= 0 && (B.charAt(left) != B.charAt(right)))
left -= shifts[left];
shifts[right + 1] = right - left++;
}
//Find match of B in A+A
int matchLen = 0;
for (char c: (A+A).toCharArray()) {
while (matchLen >= 0 && B.charAt(matchLen) != c)
matchLen -= shifts[matchLen];
if (++matchLen == N) return true;
}
return false;
}
06 小结
算法专题目前已日更超过五个月,算法题文章186+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Rotate String(Java实现)的更多相关文章
- LeetCode算法题-Repeated String Match(Java实现)
这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...
- LeetCode算法题-Construct String from Binary Tree(Java实现)
这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...
- LeetCode算法题-Reverse String II(Java实现)
这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...
- LeetCode算法题-Reverse String(Java实现)
这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...
- LeetCode算法题-Rotate Array(Java实现)
这是悦乐书的第184次更新,第186篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第43题(顺位题号是189).给定一个数组,将数组向右旋转k步,其中k为非负数.例如: ...
- LeetCode算法题-Backspace String Compare(Java实现)
这是悦乐书的第327次更新,第350篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第197题(顺位题号是844).给定两个字符串S和T,如果两个字符串都输入到空文本编辑器 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- Kotlin实现LeetCode算法题之String to Integer (atoi)
题目String to Integer (atoi)(难度Medium) 大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理. 方案1 class ...
随机推荐
- C语言检查ip是否合法
在工作当中我们经常会遇到这种问题:判断一个输入的字符串是否为合法的IP地址,下面是一个测试小程序: #include <stdio.h> #include <string.h> ...
- capwap学习笔记——初识capwap(二)(转)
2.5.1 AC发现机制 WTP使用AC发现机制来得知哪些AC是可用的,决定最佳的AC来建立CAPWAP连接. WTP的发现过程是可选的.如果在WTP上静态配置了AC,那么WTP并不需要完成AC的发现 ...
- SSM框架+MySql保存emoji表情
本博客的记录的操作在linux 项目中需要从微信获取授权来登录,在此过程,保存微信emoji表情昵称到mysql数据库的时候出了错误. 老规矩百度一下,得知是mysql的utf8字符集只支持1-3个字 ...
- nexus私服搭建及maven生命周期
一.maven找库流程 从流程上看创建nexus私服,能够优化流程,而且更加快速 二.nexus下载.安装 1.nexus下载地址 https://sonatype-download.global.s ...
- 系列博文-Three.js入门指南(张雯莉)-照相机
照相机就是这样一个抽象,它定义了三维空间到二维屏幕的投影方式,用“照相机”这样一个类比,可以使我们直观地理解这一投影方式.而针对投影方式的不同,照相机又分为正交投影照相机与透视投影照相机.我们需要为自 ...
- python3.5中,import sqlite3 出现 no module named _sqlite3的解决方法
我用的centos7.2,系统自带python2.7. 我自己装了python3.5,但在导入sqlite3这个包的时候出现找不到包的错误. 下面给出解决方法. 第一种: 检查自己有没有安装sqlit ...
- vue的常用组件方法应用
项目技术: webpack + vue + element + axois (vue-resource) + less-loader+ ... vue的操作的方法案例: 1.数组数据还未获取到,做出预 ...
- java正则使用方法
import java.util.regex.Matcher;import java.util.regex.Pattern; public class RegexMatches{ public ...
- 【最小生成树+贪心】BZOJ1821: [JSOI2010]Group 部落划分 Group
Description 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成 ...
- 【dfs+连通分量】Bzoj1123 POI2008 BLO
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...