Como encontrar substring de string sem usar o método indexof em c #?

Eu quero encontrar a posição de uma substring em uma string, se presente, sem usar qualquer método de string, incluindo indexof. Eu tentei tantas vezes, mas falhei. Alguém vai me dizer como fazer em c #? Podemos usar o operador .Length.

Desculpe .. pensei que isso seria um exercício divertido para mim, então …

Spoiler

class Program { static void Main(string[] args) { string str = "abcdefg"; string substr = "cde"; int index = IndexOf(str, substr); Console.WriteLine(index); Console.ReadLine(); } private static int IndexOf(string str, string substr) { bool match; for (int i = 0; i < str.Length - substr.Length + 1; ++i) { match = true; for (int j = 0; j < substr.Length; ++j) { if (str[i + j] != substr[j]) { match = false; break; } } if (match) return i; } return -1; } } 

Supondo que esta é a lição de casa, minha sugestão é ter em mente que uma string é um IEnumerable de chars. Então você pode percorrer os caracteres da sua string …

Uma vez que qualquer lição de casa que inspirou a pergunta está bem atrasada, aqui está uma tentativa de resposta razoavelmente bem-sucedida.

Simplesmente percorrendo a cadeia maior, e percorrendo a subcadeia comparando cada caractere como um vai, leva Θ((n-m+1) m) tempo onde m é o comprimento da subcadeia, e n o índice onde a cadeia menor é encontrada , ou se não houver correspondência, o comprimento do maior menos do que o menor.

Existem alguns algoritmos diferentes que dão melhor desempenho, que diferem entre si em termos de quais casos eles funcionam melhor. O algoritmo Knuth-Morris-Pratt leva Θ(m) para configurar e, em seguida, Θ(n) tempo para encontrar, porque primeiro cria uma tabela para saber até onde ela pode ir se não encontrar uma correspondência e, no balanço, isso faz uma busca mais rápida.

Considere que, se estivéssemos procurando por "ababcd" e tivéssemos primeiro encontrado "abab…" (possível correspondência até agora), se o próximo caractere for c , ainda teremos uma correspondência possível. Se é a não temos uma partida, mas devemos avançar dois personagens para começar a procurar uma partida a partir disso. Se é mais alguma coisa, devemos avançar cinco personagens e continuar procurando por lá. Preparar a mesa para nos dizer até que ponto saltar torna as coisas muito mais rápidas a partir de então:

 public static int IndexOf(string haystack, string needle) { if(haystack == null || needle == null) throw new ArgumentNullException(); if(needle.Length == 0) return 0;//empty strings are everywhere! if(needle.Length == 1)//can't beat just spinning through for it { char c = needle[0]; for(int idx = 0; idx != haystack.Length; ++idx) if(haystack[idx] == c) return idx; return -1; } if (needle.Length == haystack.Length) return needle == haystack ? 0 : -1; if (needle.Length < haystack.Length) { int m = 0; int i = 0; int[] T = KMPTable(needle); while(m + i < haystack.Length) { if(needle[i] == haystack[m + i]) { if(i == needle.Length - 1) return m == haystack.Length ? -1 : m;//match -1 = failure to find conventional in .NET ++i; } else { m = m + i - T[i]; i = T[i] > -1 ? T[i] : 0; } } } return -1; } private static int[] KMPTable(string sought) { int[] table = new int[sought.Length]; int pos = 2; int cnd = 0; table[0] = -1; table[1] = 0; while(pos < table.Length) if(sought[pos - 1] == sought[cnd]) table[pos++] = ++cnd; else if(cnd > 0) cnd = table[cnd]; else table[pos++] = 0; return table; } 

Tente isto:

 public static string BetweenOf(string ActualStr, string StrFirst, string StrLast) { return ActualStr.Substring(ActualStr.IndexOf(StrFirst) + StrFirst.Length, (ActualStr.Substring(ActualStr.IndexOf(StrFirst))).IndexOf(StrLast) + StrLast.Length); } 
  string mainString = Console.ReadLine(); string subString = Console.ReadLine(); for (int i = 0; i < = mainString.Length - subString.Length; i++) { bool match = true; for (int j = 0; j < subString.Length && mainString[i + j] != subString[j]; j++) { match = false; } if (match) Console.WriteLine(i); } 
 public static findindex(String str,String substr) { char a[]=str.toCharArray(); char b[]=substr.toCharArray(); int j=0,t=0; for(int i=0;i 

Tente isto:

 internal bool SearchWord(string str, string searchKey) { int j = 0; bool result = false; for (int i = 0; i < str.Length; i++) { if (searchKey[j] == str[i]) { j++; //count++; } else { j = 0; } if (j == searchKey.Length) { result = true; break; } } return result; }