给定一个仅由小写字母组成且长度不超过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); } }