题目:
求字符串的周期性前缀,输出字符串的前缀下标和周期的次数。
思路:
周期串:aaa 、abab、abcabcabc
next[j]=k:j前面的k个字符串和开头的k个字符串相等
周期数等于j%(j-k)
周期次数等于j/(j-k)
package 字符串问题;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class case16_next数组应用 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
List<String> list=new ArrayList<String>();//用于存字符串
int caseNum=1;
while(true){
int n=sc.nextInt();
if(n==0){
break;
}
String s=sc.next();
list.add(s);//字符串加进数组中
}
for(int j=0;j<list.size();j++){
String s=list.get(j);
int[] next=next(s);
System.out.println("Test case: " + (j+1));
boolean flag=false;
for(int i=2;i<next.length;i++){
int k=next[i];
int t=i-k;
if(i%(i-k)==0&&i/t>1){
flag=true;
System.out.println(i+" "+i/t);
}
}
}
System.out.println();
}
private static int[] next(String s) {
if(s==null||s.length()==0) return null;
int[] next=new int[s.length()+1];
if(s.length()==1){
return next;
}
next[0]=-1;
int j=1;
int k=next[j];//j之前的字符串的前缀和后缀的最长匹配
while(j<s.length()-1){
if(next[j]==k){
next[++j]=++k;
}else{//失配,j回溯到k,其中j和k为下标
if(k>=0){
k=next[k];
}
}
}
return next;
}
}