力扣热题:796.旋转字符串
开篇
今天下午刷了6道力扣算法题,选了一道有多种解法的题目与大家分享。
题目链接:796.旋转字符串
题目描述
代码思路
完全按照题目的要求,利用StringBuffer中的方法对字符串进行旋转,寻找相同的一项
代码纯享版
class Solution {
public boolean rotateString(String s, String goal) {
if(s.length() != goal.length()) return false;
StringBuffer str = new StringBuffer(s);
for(int i = 0; i < s.length(); i++){
if(str.toString().equals(goal)) return true;
char a = str.charAt(0);
str.delete(0,1);
str.append("" + a);
}
return false;
}
}
代码逐行解析版
class Solution {
public boolean rotateString(String s, String goal) {
if(s.length() != goal.length()) return false; //两个字符串如果长度不同,一定不符合要求
StringBuffer str = new StringBuffer(s);//改变s的类型,方便操作
for(int i = 0; i < s.length(); i++){
if(str.toString().equals(goal)) return true; //如果两个字符串一样,返回true
char a = str.charAt(0); //根据题目要求,以下3行对字符串进行旋转
str.delete(0,1);
str.append("" + a);
}
return false; //对字符串旋转与其长度相同的次数后仍无法满足要求,返回false
}
}
其它解法
1.利用取模运算,不需要对字符串进行旋转即可进行判断
class Solution {
public boolean rotateString(String s, String goal) {
int m = s.length(), n = goal.length();
if (m != n) {
return false;
}
for (int i = 0; i < n; i++) {
boolean flag = true;
for (int j = 0; j < n; j++) {
if (s.charAt((i + j) % n) != goal.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
return true;
}
}
return false;
}
}
2.这方法太牛逼了。字符串s+s中包含了旋转的所有结果,只需要判断goal是否为s+s的子串。
class Solution {
public boolean rotateString(String s, String goal) {
return s.length() == goal.length() && (s + s).contains(goal);
}
}
结语
如果这道题的分享对你有帮助,点个关注支持一下,我会每天更新力扣题目的讲解,与大家一起进步。