0
点赞
收藏
分享

微信扫一扫

314、旋转字符串

hoohack 2022-02-16 阅读 143
算法

给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。

s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 

例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。
 

示例 1:

输入: s = "abcde", goal = "cdeab"
输出: true
示例 2:

输入: s = "abcde", goal = "abced"
输出: false
 

提示:

1 <= s.length, goal.length <= 100
s 和 goal 由小写英文字母组成

package cn.fansunion.leecode.string;

/**

 * 旋转字符串 给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。

 *

 * s 的 旋转操作 就是将 s 最左边的字符移动到最右边。

 *

 * 例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。

 *

 * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 *

 * @author wen.lei@brgroup.com

 *

 *         2022-2-16

 */

public class RotateString {

    // 输入: s = "abcde", goal = "cdeab"

    // 输出: true

    public boolean rotateString(String s, String goal) {

        final int length = s.length();

        for (int index = 0; index < length; index++) {

            if (s.equals(goal)) {

                return true;

            else {

                s = rotateStr(s);

            }

        }

        return false;

    }

    // 比较清晰的代码

    public boolean rotateString2(String s, String goal) {

        if (s.equals(goal)) {

            return true;

        }

        final int length = s.length();

        for (int index = 0; index < length; index++) {

            s = rotateStr(s);

            if (s.equals(goal)) {

                return true;

            }

        }

        return false;

    }

    private String rotateStr(String s) {

        StringBuilder sb = new StringBuilder();

        sb.append(s.subSequence(1, s.length()));

        sb.append(s.charAt(0));

        return sb.toString();

    }

    // 第1次,错误的代码

    public boolean rotateStringError(String s, String goal) {

        final int length = s.length();

        // 本来想优化一次,用“length - 1”,结果边界值情况,单元测试,没测到,尴尬了

        // 为什么呢?index=0遍历,是原地比较,没有rotate

        for (int index = 0; index < length - 1; index++) {

            if (s.equals(goal)) {

                return true;

            else {

                s = rotateStr(s);

            }

        }

        return false;

    }

     

    //官方,创新解法

    //在写代码的过程中,更加侧重“按照题目的功能和流程”来实现,这种“投机取巧”的解法,一般不会特别去想

    //"蛇咬住自己的尾巴”,头脑中可能有1/10000的瞬间,考虑过类似思路,没细想,习惯标准解法了

    public boolean rotateString5(String A, String B) {

        return A.length() == B.length() && (A + A).contains(B);

    }

}

package test.leecode.string;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.string.RotateString;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-16

 */

public class RotateStringTest {

    @Test

    public void test() {

        RotateString rs = new RotateString();

        boolean true1=rs.rotateString("abcde""cdeab");

        Assert.assertEquals(true, true1);

        boolean true2=rs.rotateString("abcde""bcdea");

        Assert.assertEquals(true, true2);

        boolean true3=rs.rotateString("abcde""abcde");

        Assert.assertEquals(true, true3);

        //边界值,务必测试到

        boolean true4=rs.rotateString("abcde""eabcd");

        Assert.assertEquals(true, true4);

        boolean false1=rs.rotateString("abcde""dceab");

        Assert.assertEquals(false, false1);

    }

}

举报

相关推荐

0 条评论