描述

字符串旋转: 给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(可以为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。

示例:

  1. 如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’切割换位后得到‘zanyou’和B相同,返回true。
  2. 如果A=‘abcd’,B=‘abcd’,A切成‘abcd’和''(空串),换位后可以得到B,返回true。

思路1:旋转

不断将A的第一个字符放到末尾,比较AB是否相等

思路2:双指针

想象成一圈跑道:A和B起点不同,相距x米。

  1. A先跑x米,到达B的起点处,两者开始一起跑
  2. 直到B跑完一圈回到起点,期间A会经过一次自己的起点。
  3. 如果A跑完2圈,B还没回到起点,说明A没有遇到B
public class Solution {
    public boolean solve (String A, String B) {
        if(A.length() != B.length()) {
            return false;
        }
        int i = 0;
        int j = 0;
        int len = A.length();
        while(j < B.length()) {
            if(i == len * 2) {
                return false;
            }
            if(A.charAt(i % len) == B.charAt(j)) {
                j++;
            } else {
                j = 0;
            }
            i++;
        }
        return true;
    }
}

思路3:A+A包含B

类似思路2,A走完两圈B一定能走完

public class Solution {
    public boolean solve (String A, String B) {
        if(A.length() == B.length() && (A+A).contains(B)) {
            return true;
        }
        return false;
    }
}