3

この問題を解決するための問題に直面しています。たとえば、文字列変数があります

              string text="ABCD,ABCDABCD,ADCDS";

上記の文字列で「BC」のような文字列値を検索し、「BC」が発生する位置を見つける必要があります。つまり、その文字列変数で「BC」を検索すると、出力は1,6になります。

              0   1   2   3  4    5   6   7   8   9   10  11 12   13
            -------------------------------------------------------
            | A | B | C | D | , | A | B | C | D | , | A | D | C | S |
            -------------------------------------------------------

問題は、組み込みの文字列クラスメソッドを使用できないことcontains()ですlastIndexOf()。誰かが私がこれをするのを手伝ってくれる?

4

6 に答える 6

1

問題は、組み込みの文字列クラスメソッド'contains()'、'lastIndexOf()'を使用できないことです。誰かが私がこれをするのを手伝ってくれる?

次に、独自に構築できます。でもSubstring禁じられていると思います。

string text="ABCD,ABCDABCD,ADCDS";
string whatToFind = "BC";

List<int> result = new List<int>();
for(int index=0; index < text.Length; index++)
{
    if(index + whatToFind.Length > text.Length)
        break;
    bool matches = true;
    for(int index2=0; index2<whatToFind.Length; index2++)
    {
        matches = text[index+index2] == whatToFind[index2];
        if(!matches)
            break;
    }
    if(matches)
        result.Add(index);
}

実行中のコードは次のとおりです:http://ideone.com/s7ej3

于 2012-06-28T11:33:30.180 に答える
0

自分のバージョンをロールバックするのIndexOfは難しくありません(すでに受け取った回答によると)。それは宿題なので、おそらくそれを回避することができます。

ただし、おそらく想像できるように、単純なforループはそれを行うための最も効率的な方法ではありません。文字列検索は重要なトピックであり、宿題の外でそれを実装する必要はおそらくないでしょうが、あなた自身の啓蒙のためにそれについて読むことができます。

于 2012-06-28T11:17:34.283 に答える
0

これはあなたのためにうまくいくはずです:

string text="ABCD,ABCDABCD,ADCDS";
var seekindex = 0;
var positions = new List<int>();
while( seekindex < text.Length ){
  var index = text.IndexOf( "BC", seekindex);
  if( index > -1){
    positions.Add(index);
    seekindex = index + 1;
  }else{
    break;
  }
}

これはIndexOf、startindexを使用したメソッドを使用して、次回は前のヒット位置からの検索を継続し、untillIndexOfが-1を返すまでヒットがないことを確認します。

positions最後にインデックスが含まれ、結果は実際には1,6ではなく1,6,10になります;)

編集

彼は使用できないことに気づきましたIndexOf。再試行します:)

string text="ABCD,ABCDABCD,ADCDS";
var positions = new List<int>();
for( int i = 0; i < text.Length-1; i++ ){
  if( text[i] == 'B' && text[i+1] == 'C' ){
    positions.Add(i);
  }
}

if文は現在の文字と次の文字の両方をチェックするため、ここではパフォーマンスの問題のように見えるかもしれません。したがって、すべての文字を2回チェックします。

しかし、実際にはそうではありません。間にAND(&&)があるため、text[i]がBでない場合、ifが失敗することがわかっているため、2番目のチェックは実行されません。

于 2012-06-28T11:08:44.920 に答える
0
string text = "ABCD,ABCDABCD,ADCDS";
            int location;
            for (int i = 0; i < text.Length; i++)
                if (text[i] == 'B')
                    if (text[i + 1] == 'C')
                    {
                        location = i;
                        i++;
                    }

編集:

List<int> locations = new List<int>();
string text = "ABCD,ABCDABCD,ADCDS";
                for (int i = 0; i < text.Length; i++)
                    if (text[i] == 'B')
                        if (text[i + 1] == 'C')
                        {
                            location.Add(i);
                            i++;
                        }
于 2012-06-28T11:08:54.697 に答える
0

宿題に規則的な表現を使うことはおそらくできないでしょう。最善の解決策は、文字列をchar配列と考えることです。http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithmについて読む

于 2012-06-28T11:09:27.780 に答える
0

以下は、要件に対して完全に機能する例ですが、優れていて低速であり、メモリフットプリントも大きくなっています。

string text = "ABCD,ABCDABCD,ADCDS";
string whatToFind = "BC";

string delim = "";    

for(int index=0; index < text.Length; index++)
{
    if(index + whatToFind.Length > text.Length)
        break;

    if(text.SubString(index, whatToFind.Length) == whatToFind)
    {
        Console.Out.WriteLine(delim + index.ToString())
        delim = ",";
    }
}

パフォーマンスとメモリ使用量を改善するための演習として、読者に任せます。より速い答えを達成するよりも、これが遅い場所と理由を理解する方が便利です。

于 2012-06-28T12:21:22.313 に答える