给定一个仅由小写字母组成且长度不超过106的字符串,将首字符移到末尾并记录所得的字符串,不断重复该操作,虽然记录了无限个字符串,但其中不同字符串的数目却是有限的,那么一共记录了多少个不同的字符串?
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User:是two倩呀!
* Data:2022-09-21
* Time:18:30
*/
public class demo1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String ret = scanner.next();
String str = scanner.next();//子串
int[] next = new int[str.length()];
//求next数组 求子串的最长前后缀匹配
int i = 0;
int j = 1;
//求next数组
while (j < str.length()) {
if (str.charAt(i) == str.charAt(j)) {//如果匹配了,在最长匹配的基础上+1
i++;
next[j++] = i;
} else {//不匹配
if (i == 0) {//如果i==0了 肯定不存在以elem[i]为底的最长公共前后缀 因为str[0]之前没有元素 那么next[j]=0
j++;
next[i] = 0;
} else { //找寻以j-1也就是i-1元素为底的最长字符匹配长度 看能不能在这个元素的基础之上 拼接j对应的元素
i = next[i - 1];
}
}
}
//求最长匹配
j = 0;
i = 0;
while (i < ret.length() && j < str.length()) {
if (ret.charAt(i) == str.charAt(j)) {
i++;
j++;
} else {
if (j == 0)
i++;
else
j = next[j - 1];
}
}
if (j == str.length())//匹配成功 输出主串中开始匹配的下标
System.out.println(i - j);
else
System.out.println(-1);
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
char[] pattern = string.toCharArray();
int n = pattern.length;
int[] nexts = new int[n];
nexts[0] = 0;
int i = 1;
int len = 0;
while(i < n) {
if(pattern[i] == pattern[len]) {
len++;
nexts[i] = len;
i++;
}
else {
if(len > 0) len = nexts[len - 1];
else {
nexts[i] = len;
i++;
}
}
}
if(n % (n - nexts[n - 1]) == 0)
System.out.println(n - nexts[n - 1]);
else System.out.println(n);
}
}