1

CS学生です。いつものように戸惑います。私の仕事は、.charAt() と .length() のみを使用して、文字列から部分文字列を検索することです (どちらもユーザーが提供します)。返す必要があるのは、文字列内の部分文字列の開始インデックス (または、まったく存在しない場合は -1) です。率直に言って、どこから始めればよいかわかりません。私は次のようなことを試みました:

for (int i=0;i<string.length();i++)
    if (string.charAt(i) == substring.charAt(i))

それが本当なら、それぞれの文字列の次の 2 文字を比較するようなことをしたかったのです。私はここで基地から離れていますか?地面から降りる方法について何かアドバイスはありますか?

読んでくれてありがとう。

4

5 に答える 5

1

charAtandlengthメソッドの使用のみが許可されている場合は、ネストされた for ループが必要になります。あなたのエクササイズを台無しにしないために、私はあなたのためにそれをせずにあなたが始められるように最善を尽くします.

for(int i = 0; i < string.length(); i++)
    for(int j = 0; j < substring.length(); j++)

ここにあるのは、文字列の各インデックスに対して、部分文字列のすべての文字を繰り返し処理し、何かを行うということです。明らかに、何らかの方法でキャラクターを比較する必要があります。部分文字列全体を通過し、文字が一致する場合は、部分文字列が開始された場所であるため、外側のループのカウントを返す必要があります。

ネストされたループ全体を通過し、部分文字列の位置のインデックスを返していない場合は、-1 を返す必要があります。ifそのロジックを提供するには、そこにステートメントが必要です。助けが必要な場合はコメントしてください!

于 2013-10-29T20:52:06.187 に答える
1

単純な解決策を実行することが期待されている場合は、2 つのループを設定するだけで済みます。文字列の位置を反復する for ループと、部分文字列の先頭文字を文字列内の文字と一致させる場合にクエリとメイン文字列を反復するために使用できる内側の while ループ。必要なことは、主な文字列の外に出ていないことを確認することだけです。これは、適切な for ループのインデックス付けで行うことができます。内側の while ループでは、外側のループのカウンターと内側のループのカウンターの組み合わせを使用して、必要な比較を行うことができます。

これは宿題なのでコードは含めませんでしたが、ここからは問題ありません。

于 2013-10-29T20:52:27.220 に答える
1

テストなし:

private static final int indexOf(String string, String substring) {
    outerloop: for (int i = 0; i < string.length() - substring.length(); i++) {
        for (int j = 0; j < substring.length(); j++) {
            if (substring.charAt(j) != string.charAt(i + j)) {
                continue outerloop;
            }
        }
        return i;
    }
    return -1;
}
于 2013-10-29T20:52:49.603 に答える
0

ナイスアプローチ@rolfl。ソリューションへの小さな貢献の追加: string が substring と等しい場合に小さなバグがあります。外側のループに入ることはなく、string="cat" と substring="cat" を使用できるため、indexOf は 0 にする必要があります。outloop を変更すると、次のように動作するはずです。i < s1.length() - (substring.length()-1)

  @Test
  public void test_firstSubstring(){
    String s = "cat";
    String p = "cat";

    int actual = findFirstSubstring(s,p);
    assertEquals(0,actual);
  }

public static int findFirstSubstring(String s1, String substring){
    if(s1.isEmpty() || substring.isEmpty() || substring.length() > s1.length()){ 
        return -1;
    }

    outloop: for (int i = 0; i < s1.length() - (substring.length()-1) ; i++){
        for (int j=0; j < substring.length(); j++){
                if (s1.charAt(i+j) != substring.charAt(j)) {
                    continue outloop;
                }
            }
            return i;
    }
    return -1;
  }
于 2015-01-23T21:32:59.000 に答える