質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

354閲覧

文字列検索のプログラムで2つのwhile文でやっていることを解説して頂けませんか?

gyro16

総合スコア89

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/06/28 04:19

編集2017/06/28 04:38

###前提・実現したいこと

文字列検索のプログラムで出現位置を出力するものです。
文字列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/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/28 04:24

自身がどこまで理解していてどこが分からないかを明確にしたほうが良いかと。
s.t.

2017/06/28 04:25

このプログラムを書いた人に、変数の名前のつけかたを変えてもらうとわかりやすくなるかもしれません・・・。
mattn

2017/06/28 04:32

「課題に対してアプローチしたことを記載してください」これはご自分で書く物です。
kunai

2017/06/28 04:47

ダメなコードの書き方のお手本のようなコードですね。。
guest

回答2

0

こういうものをアルゴリズムの初歩の勉強の教材として参考にするのはよいと思います。ただ、コードを読むことに慣れてない段階では字面を眺めても何をしているのか見えてこないと思います。

もしあなたが配列やJavaの++演算子の意味がわからないというレベルでしたら、プログラマー(のためのQ&A)サイトで質問するのは遠慮した方がよさそうです。言語の基本知識を学ぶ前の段階の人はプログラマーとしての質問をすることは難しいということだと思います。

さて、Javaの文法や意味についてならわかるというのであれば、あなたに不足しているのはアルゴリズムを読み解く力ということになります。こちらの方もプログラマーが初期のころ自らの訓練によって身に着けるものなので、あまり初歩的なものだとやはりプログラマーのQ&Aサイトで聞くのは少々はばかられると思った方がよいでしょう。

まぁしかしちょっとしたコツをご紹介しましょう。SとPは文字の配列ですね、Tはintの配列です。iとかjはこれらの配列の要素の位置を表すインデックスです。このwhile文で何をしているかを考えるには紙にペンで配列の絵とi,jがどこを指しているかを書き示し、自分が計算機になったつもりでどういうふうに値が変化していくかをシミュレートしてみるとよいと思います。

S +-+-+-+-+-+-+-+ i = 0 |A|B|B|D|B|B|D| j = 0 +-+-+-+-+-+-+-+ P +-+-+-+ |B|B|D| +-+-+-+ T +-+-+-+-+ |0|0|0|0| +-+-+-+-+ 最初のwhileループではどうなるか・・・

「うへぇ」と思ったかも知れませんが、このくらいのことはある程度の訓練を積んだプログラマーなら紙の上に一々書かなくても「頭の中にイメージを思い浮かべること」を普通にやっています。慣れてくるとこんなイメージさえ必要とせずコードから直接意味を読み取ることができるようになります。まぁしかし最初からは無理ですのでまずは紙とペンで地道にやってみてください。

投稿2017/06/28 05:03

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyro16

2017/06/28 05:53

分かりました。
guest

0

ベストアンサー

こちらの実装だと思いますので、全容わかるとイメージがより掴みやすいかと。

変数名わかりにくっ!と、私も思ったのですが意味あったのですね。

投稿2017/06/28 05:28

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2017/06/28 05:30

文字切れしてる・・・例のあれですね。 > 私も思ったのですが意味あったのですね。 と書いてあります。
gyro16

2017/06/28 05:54

そうですね。これですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問