判断一个字符串旋转是否为另一个字符串,可以转换成等价问题,前面字符串拼接两份,再看是否包含第二个字符串,从而省去了旋转这些操作,而转换成字符串匹配问题,如果是笔试为了赶时间,可以直接调用系统的函数判断是否contain;平时刷题可以拿来练一下kmp算法;
以下是kmp算法的实现,已AC import java.util.Scanner;
import static java.lang.System.in;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(in);
String[] data = sc.nextLine().split(";");
if (data[0] == null || data[1] == null || data[0].length() == 0 || data[1].length() == 0 || data[0].length() != data[1].length()) {
System.out.println(false);
return;
}
String str1 = data[0] + data[0], str2 = data[1];
int pos = kmp(str1.toCharArray(), str2.toCharArray());
System.out.println(pos == -1 ? false : true);
}
public static int kmp(char[] arr1, char[] arr2) {
int i = 0, j = 0;
int[] nextArr = getNextArr(arr2);
while (i < arr1.length && j < arr2.length) {
if (arr1[i] == arr2[j]) {
i++;
j++;
} else if (nextArr[j] != -1) {
j = nextArr[j];
} else {
i++;
}
}
return j == arr2.length ? i - j : -1;
}
public static int[] getNextArr(char[] arr) {
if (arr.length == 1) {
return new int[]{-1};
}
int[] next = new int[arr.length];
next[0] = -1;
next[1] = 0;
int i = 2;
int cn = 0;
while (i < arr.length) {
if (arr[i - 1] == arr[cn]) {
next[i++] = ++cn;
} else if (cn > 0) {
cn = next[cn];
} else {
next[i++] = 0;
}
}
return next;
}
}