LeetCode刷题记录(六):旋转字符串

122 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

旋转字符串

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

题目提供素材:

  1. 两个只包含小写字母的字符串。

注:没有两个字符串的长度相同,那么就一定存在不相同的情况。

题目预期结果:

两个字符串,其中一个字符串通过旋转,并且不限次数,最后可以与另外一个字符串相同,即为true;反之则为false。

注:旋转是将最左边的字母移至最后一位,并不是自由组合。这里我一开始按照自由组合马上就写出来了,随后就提交失败了,大意没有看清题目。

我的解决过程

这种情况,循环遍历绝对可行,顺着这个思路去想的话。

是比对字符串1中的某个字母,一定会在字符串2中出现;并且这个字母的下一个字母也应该与字符串2中下一个字母的顺序一致。

比如abcdecdeab这个正确案例,其顺序是不变的,只不过存在首尾问题。

开始编写

来看一下使用循环如何解决的吧,代码如下:

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也就可以了。

执行结果

大家一起刷,才更有意思。

所以,你今天刷题打卡了吗?

image.png