2012-06-28 2 views
3

У меня возникла проблема с решением этой проблемы. Я с переменной строкой, для примераНайти подходящее слово в C#

   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(). может ли кто-нибудь помочь мне сделать это?

+6

Предполагая, что это домашнее задание? Если да, тогда пометьте его как таковой, пожалуйста. Кроме того, [что вы пробовали?] (Http://www.whathaveyoutried.com) –

+0

@ J.Steen Теперь я перешел на домашнюю работу. Я пробовал с вложенным циклом, но он работал только для поиска одиночного символа. – Aroor

+2

Покажите нам некоторые из ваших работ. Мы предпочитаем сначала пытаться самостоятельно решать проблемы, а затем задавать вопросы о конкретных проблемах, с которыми вы сталкиваетесь. =) –

ответ

1

Проблема в том, что мы не можем использовать встроенные методы класса строки 'содержит()', '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

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, чтобы убедиться, что мы по-прежнему SEARHING из нашего предыдущего хит месте в следующий раз, и до тех пор пока IndexOf возвращает -1 индикаторные нет больше хитов.

positions будет содержать индексы в конце концов, и результат на самом деле 1,6,10, а не 1,6;)

EDIT

Просто понял, что он не мог использовать 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); 
    } 
} 

Может показаться, что проблема Палатки здесь, так как, если приговор проверяет как текущий и следующий символ, и, следовательно, проверка всех символов в два раза.

Но на самом деле это не так. Из-за И (&) между ними, если text[i] не является B, он не выполнит вторую проверку, так как знает, что if все равно сработает.

+0

OP не может использовать 'IndexOf'. –

+0

@ Øyvind Knobloch-Bråthen благодарит за ваш быстрый ответ. но мы не можем использовать метод IndexOf(), извинения, о которых я упоминал ранее – Aroor

+0

Упс, не прочитал эту часть вопроса. Но это становится намного более неприятным без этого;) –

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++; 
        } 

EDIT:

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++; 
         } 
+0

изменить 'int location' на' List locations = new Список (); 'и затем изменить' location = i; 'на' location.Add (i); 'затем вы добавите все индексы, которые являются правильными. Теперь вы получите только последний номер – harry180

+0

. Да, я знаю это, но он мог бы вывести его сразу, и я думаю, что он уже каким-то образом хранит места, если нет, и это, вероятно, домашнее задание, и он должен подумать немного больше или, по крайней мере, чтобы хранить ints, чтобы он мог стать лучшим программистом – Alucarder

0

Прокрутка собственной версии IndexOf не сложна (согласно полученным ответам), а так как это домашнее задание, вы, вероятно, можете избежать неприятностей.

Однако, как вы можете себе представить, простой цикл for - это не самый эффективный способ сделать это. Поиск по строкам является важной темой, и, несмотря на то, что вам, вероятно, не понадобится снова выполнять его за пределами домашней работы, вы можете read about it для собственного назидания.

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 = ","; 
    } 
} 

Я оставил это для читателя как упражнение для повышения производительности и использования памяти. Полезнее понимать, где и почему это медленнее, чем для быстрого ответа.

Смежные вопросы