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

下面是一个满足您要求的完美示例,但也很好而且很慢,而且内存占用也很大:

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 回答
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 的方法来确保我们下次继续从之前的命中位置搜索,直到IndexOf返回 -1 指示不再有命中。

positions最后将包含索引,结果实际上是 1,6,10 而不是 1,6 ;)

编辑

才意识到自己不能用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 语句同时检查当前字符和下一个字符,因此检查所有字符两次。

但实际上不会。由于两者之间的 AND (&&),如果text[i]不是 B,它不会执行第二次检查,因为它知道 if 无论如何都会失败。

于 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

滚动您自己的版本IndexOf并不难(根据您已经收到的答案),并且由于它是家庭作业,您可能可以侥幸逃脱。

但是,正如您可能想象的那样,简单的for循环并不是最有效的方法。字符串搜索是一个重要的话题,尽管您可能不再需要在家庭作业之外实现它,但您可以阅读它以供您自己启迪。

于 2012-06-28T11:17:34.283 回答