###前提・実現したいこと
文字列検索のプログラムで出現位置を出力するものです。
文字列Sから文字列Pを探して出現位置を出力するものです。
while文でやっていることを解説して頂きたいです。
1つ目や2つ目ののwhile文について解説して欲しいです。
やっていることを理解したいのでお願い致します。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
java
1import java.io.*; 2import java.util.*; 3 4public class Algo49{ 5 private static FastScanner sc = new FastScanner(); 6 7 public static void main(String[] args){ 8 char[] S = sc.next().toCharArray(); 9 char[] P = sc.next().toCharArray(); 10 int n = S.length; 11 int m = P.length; 12 13 int[] T = new int[m+1]; 14 T[0] = -1; 15 T[1] = 0; 16 int i = 2; 17 int j = 0; 18 while(i <= m){ 19 if(P[i-1] == P[j]){ 20 T[i] = j + 1; 21 i++; 22 j++; 23 }else if(j > 0){ 24 j = T[j]; 25 }else{ 26 T[i] = 0; 27 i++; 28 } 29 } 30 31 i = 0; 32 j = 0; 33 StringBuilder ans = new StringBuilder(); 34 while(i + j < n){ 35 if(P[j] == S[i + j]){ 36 j++; 37 if(j == m){ 38 ans.append(i); 39 ans.append("\n"); 40 }else{ 41 continue; 42 } 43 } 44 i = i + j - T[j]; 45 if(j > 0){ 46 j = T[j]; 47 } 48 } 49 50 System.out.print(ans); 51 } 52 53 static class FastScanner{ 54 BufferedReader br; 55 StringTokenizer st; 56 57 public FastScanner(){ 58 br = new BufferedReader(new InputStreamReader(System.in)); 59 } 60 61 String next(){ 62 while(st == null || !st.hasMoreElements()){ 63 try{ 64 st = new StringTokenizer(br.readLine()); 65 }catch(IOException e){ 66 e.printStackTrace(); 67 } 68 } 69 return st.nextToken(); 70 } 71 72 int nextInt(){ 73 return Integer.parseInt(next()); 74 } 75 76 long nextLong(){ 77 return Long.parseLong(next()); 78 } 79 80 double nextDouble(){ 81 return Double.parseDouble(next()); 82 } 83 84 String nextLine(){ 85 String str = ""; 86 try{ 87 str = br.readLine(); 88 }catch(IOException e){ 89 e.printStackTrace(); 90 } 91 return str; 92 } 93 } 94}
###試したこと
これは他人が書いたプログラムです。
短くまとまっているので参考にしようとしていますが、while文ブロックでの処理が何が行われているか、知りたいのです。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答2件
あなたの回答
tips
プレビュー