1. 程式人生 > >字符串----HDU-1358

字符串----HDU-1358

style main info 周期性 打印 arr n) ring void

  技術分享圖片

  技術分享圖片

  題目大意:求字符串的前綴是否為周期串,若是,打印出循環節的長度以及循環次數。

  這道題考察的是KMP算法中next數組的應用,必須理解透next[]數組代表的含義才t能通過它解決這道題。思路是先構造出 next[] 數組,下標為 i,定義一個變量 t = i - next[i] 就是next數組下標和下標對應值的差,如果這個差能被下標i整除,即 i%t==0 ,則說明下標i之前的字符串(周期性字符串長度為 i)一定可以由一個前綴周期性的表示出來,這個前綴的長度為剛才求得的那個差,即 t,則這個前綴出現的次數為 i/t 。所以最後輸出 i 和 i/t 即可。

  代碼:

 1
import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 public class HDU1358 { 6 7 public static void main(String[] args) { 8 Scanner scanner = new Scanner(System.in); 9 List<String> list = new ArrayList<String>(); 10 11
while(true){ 12 int n = scanner.nextInt(); 13 if(n==0) break; 14 String s = scanner.next(); 15 list.add(s); 16 } 17 for(int j = 0;j<list.size();j++){ 18 String s = list.get(j); 19 20 int
[]next = next(s); 21 System.out.println("Test case #"+(j+1)); 22 boolean flag = false; 23 for(int i=2;i<next.length;i++){ 24 int k = next[i]; 25 int t = i-k; 26 if (i%t==0&&i/t>1) { 27 System.out.println(i +" "+i/t); 28 } 29 } 30 // if (!flag) System.out.println(0+" "+0); 31 System.out.println(); 32 } 33 } 34 35 private static int[] next(String s) { 36 if(s==null||s.length()==0)return null; 37 int[]next = new int[s.length()+1]; 38 next[0] = -1; 39 if(s.length()==1) return next; 40 next[1] = 0; 41 int j = 1; 42 int k = next[j]; 43 while(j<s.length()){ 44 if(k==-1||s.charAt(j)==s.charAt(k)){ 45 next[++j] = ++k; 46 }else { 47 k = next[k]; 48 } 49 } 50 return next; 51 } 52 53 }

  結果:

    技術分享圖片

字符串----HDU-1358