一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
旋转字符串
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
题目提供素材:
- 两个只包含小写字母的字符串。
注:没有两个字符串的长度相同,那么就一定存在不相同的情况。
题目预期结果:
两个字符串,其中一个字符串通过旋转,并且不限次数,最后可以与另外一个字符串相同,即为true;反之则为false。
注:旋转是将最左边的字母移至最后一位,并不是自由组合。这里我一开始按照自由组合马上就写出来了,随后就提交失败了,大意没有看清题目。
我的解决过程
这种情况,循环遍历绝对可行,顺着这个思路去想的话。
是比对字符串1中的某个字母,一定会在字符串2中出现;并且这个字母的下一个字母也应该与字符串2中下一个字母的顺序一致。
比如abcde和cdeab这个正确案例,其顺序是不变的,只不过存在首尾问题。
开始编写
来看一下使用循环如何解决的吧,代码如下:
public static boolean rotateString(String s, String goal) {
if(s.length() == goal.length()){
for(int i = 0; i < s.length(); i++){
boolean flag = true;
for (int j = 0; j < goal.length(); j++) {
if (s.charAt((i + j) % goal.length()) != goal.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
return true;
}
}
}
return false;
}
通过双重循环,去字符串2中寻找当前位置以及下一位置的字母是否能够对应,如果能够对应,那么证明没有问题。
字符串1所有的字母循环遍历下来,都可以在字符串2找到相应字母,以及相应字母的下一个字母,就确保没有问题了。
新思路
我一开始写的代码没有使用charAt,而是使用substring方法,看着题解中使用的charAt,想想也是这个效率比较高。
我还看到一个更好的方案,一行代码解决问题,代码如下:
public static boolean rotateString(String s, String goal) {
return s.length() == goal.length() && (s + s).contains(goal);
}
刚才说了,首尾问题是比对时候比较难办的,如果在字符串1的基础上再拼接上一个相同的字符串1,那么首尾问题就解决了。
这个时候只需要判断是否包含字符串2也就可以了。
执行结果
大家一起刷,才更有意思。
所以,你今天刷题打卡了吗?