Livro de Sedgewick e Wayne: parte da sec.5.3, p.758. Website do livro: resumo sec.5.3, slides. Código fonte, documentação, e dados de teste de todos os programas do livro: veja algs4.cs.princeton.edu/code/.
O problema substring search consiste em encontrar uma dada string dentro de outra maior. Por exemplo, encontrar canoeiro em
QUINCAS BORBA Machado de Assis CAPÍTULO I RUBIÃO fitava a enseada, -- eram oito horas da manhã. Quem o visse, com os polegares metidos no cordão do chambre, à janela de uma grande casa de Botafogo, cuidaria que ele admirava aquele pedaço de água quieta; mas, em verdade, vos digo que pensava em outra coisa. Cotejava o passado com o presente. Que era, há um ano? Professor. Que é agora? Capitalista! Olha para si, para as chinelas (umas chinelas de Túnis, que lhe deu recente amigo, Cristiano Palha), para a casa, para o jardim, para a enseada, para os morros e para o céu; e tudo, desde as chinelas até o céu, tudo entra na mesma sensação de propriedade. -- Vejam como Deus escreve direito por linhas tortas, pensa ele. Se mana Piedade tem casado com Quincas Borba, apenas me daria uma esperança colateral. Não casou; ambos morreram, e aqui está tudo comigo; de modo que o que parecia uma desgraça... CAPÍTULO II QUE abismo que há entre o espírito e o coração! O espírito do ex-professor, vexado daquele pensamento, arrepiou caminho, buscou outro assunto, uma canoa que ia passando; o coração, porém, deixou- se estar a bater de alegria. Que lhe importa a canoa nem o canoeiro, que os olhos de Rubião acompanham, arregalados? Ele, coração, vai dizendo que, uma vez que a mana Piedade tinha de morrer, foi bom que não casasse; podia vir um filho ou uma filha... -- Bonita canoa! -- Antes assim! -- Como obedece bem aos remos do homem! -- O certo é que eles estão no céu!
Esta página discute um algoritmo inocente (de força bruta) para o problema. Algoritmos mais sofisticados são discutidos nas páginas seguintes.
Resumo:
TGGTAAGCGGTTCCTGCCCCGGCTCAGGGCCAAGAACAGATGAGA CAGCTGAGTGATGGGCCAAACAGGATATCTGTGGTAAGCAGTTCC TGCCCCGGCTCGGGGCCAAGAACAGATGGTCCCCAGATGCGGTCC AGCCCTCAGCAGTTTCTAGTGAATCATCAGATGTTTCCAGGGTGC CCCAAGGACCTGAAAATGACCCTGTACCTTATTTGAACTAACCAA TCAGTTCGCTTCTCGCTTCTGTTCGCGCGCTTCCGCTCTCCGAGC TCAATAAAAGAGCCCACAACCCCTCACTCGGCGCGCCAGTCTTCC GATAGACTGCGTCGCCCGGGTACCCGTATTCCCAATAAAGCCTCT TGCTGTTTGCATCCGAATCGTGGTCTCGCTGTTCCTTGGGAGGGT CTCCTCTGAGTGATTGACTACCCACGACGGGGGTCTTTCATTTGG GGGCTCGTCCGGGATTTGGAGACCCCTGCCCAGGGACCACCGACC CACCACCGGGAGGTAAGCTGGCCAGCAACTTATCTGTGTCTGTCC GATTGTCTAGTGTCTATGTTTGATGTTATGCGCCTGCGTCTGTAC TAGTTAGCTAACTAGCTCTGTATCTGGCGGACCCGTGGTGGAACT GACGAGTTCTGAACACCCGGCCGCAACCCTGGGAGACGTCCCAGG GACTTTGGGGGCCGTTTTTGTGGCCCGACCTGAGGAAGGGAGTCG ATGTGGAATCCGACCCCGTCAGGATATGTGGTTCTGGTAGGAGAC GAGAACCTAAAACAGTTCCCGCCTCCGTCTGAATTTTTGCTTTCG GTTTGGAACCGAAGCCGCGCGTCTTGTCTGCTGCAGCATCGTTCT GTGTTGTCTCTGTCTGACTGTGTTTCTGTATTTGTCTGAAAATTA GGGCCAGACTGTTACCACTCCCTTAAGTTTGACCTTAGGTCACTG GAAAGATGTCGAGCGGATCGCTCACAACCAGTCGGTAGATGTCAA GAAGAGACGTTGGGTTACCTTCTGCTCTGCAGAATGGCCAACCTT TAACGTCGGATGGCCGCGAGACGGCACCTTTAACCGAGACCTCAT CACCCAGGTTAAGATCAAGGTCTTTTCACCTGGCCCGCATGGACA CCCAGACCAGGTCCCCTACATCGTGACCTGGGAAGCCTTGGCTTT TGACCCCCCTCCCTGGGTCAAGCCCTTTGTACACCCTAAGCCTCC GCCTCCTCTTCCTCCATCCGCCCCGTCTCTCCCCCTTGAACCTCC TCGTTCGACCCCGCCTCGATCCTCCCTTTATCCAGCCCTCACTCC TTCTCTAGGCGCCGGAATTCGTTAACTCGAGGATCCGGCTGTGGA ATGTGTGTCAGTTAGGGTGTGGAAAGTCCCCAGGCTCCCCAGCAG GCAGAAGTATGCAAAGCATGCATCTCAATTAGTCAGCAACCAGGT GTGGAAAGTCCCCAGGCTCCCCAGCAGGCAGAAGTATGCAAAGCA TGCATCTCAATTAGTCAGCAACCATAGTCCCGCCCCTAACTCCGC CCATCCCGCCCCTAACTCCGCCCAGTTCCGCCCATTCTCCGCCCC ATGGCTGACTAATTTTTTTTATTTATGCAGAGGCCGAGGCCGCCT CGGCCTCTGAGCTATTCCAGAAGTAGTGAGGAGGCTTTTTTGGAG GCCTAGGCTTTTGCAAAAAGCTGCCCAAGCTGATCCCCGGGGGCA ATGAGATATGAAAAAGCCTGAACTCACCGCGACGTCTGTCGAGAA GTTTCTGATCGAAAAGTTCGACAGCGTCTCCGACCTGATGCAGCT CTCGGAGGGCGAAGAATCTCGTGCTTTCAGCTTCGATGTAGGAGG GCGTGGATATGTCCTGCGGGTAAATAGCTGCGCCGATGGTTTCTA CAAAGATCGTTATGTTTATCGGCACTTTGCATCGGCCGCGCTCCC GATTCCGGAAGTGCTTGACATTGGGGAATTCAGCGAGAGCCTGAC CTATTGCATCTCCCGCCGTGCACAGGGTGTCACGTTGCAAGACCT GCCTGAAACCGAACTGCCCGCTGTTCTGCAGCCGGTCGCGGAGGC CATGGATGCGATCGCTGCGGCCGATCTTAGCCAGACGAGCGGGTT CGGCCCATTCGGACCGCAAGGAATCGGTCAATACACTACATGGCG TGATTTCATATGCGCGATTGCTGATCCCCATGTGTATCACTGGCA AACTGTGATGGACGACACCGTCAGTGCGTCCGTCGCGCAGGCTCT CGATGAGCTGATGCTTTGGGCCGAGGACTGCCCCGAAGTCCGGCA CCTCGTGCACGCGGATTTCGGCTCCAACAATGTCCTGACGGACAA TGGCCGCATAACAGCGGTCATTGACTGGAGCGAGGCGATGTTCGG GGATTCCCAATACGAGGTCGCCAACATCTTCTTCTGGAGGCCGTG GTTGGCTTGTATGGAGCAGCAGACGCGCTACTTCGAGCGGAGGCA TCCGGAGCTTGCAGGATCGCCGCGGCTCCGGGCGTATATGCTCCG CATTGGTCTTGACCAACTCTATCAGAGCTTGGTTGACGGCAATTT CGATGATGCAGCTTGGGCGCAGGGTCGATGCGACGCAATCGTCCG ATCCGGAGCCGGGACTGTCGGGCGTACACAAATC
Podemos dizer que o padrão é pat[0..M-1] e o texto é txt[0..N-1].
A short historyna página 759 do livro.
public static int search(String pat, String txt) { int j, M = pat.length(); int i, N = txt.length(); for (i = 0; i <= N - M; i++) { for (j = 0; j < M; j++) if (txt.charAt(i+j) != pat.charAt(j)) break; if (j == M) return i; } return N; }
public static int search(String pat, String txt) {
int j, M = pat.length();
int i, N = txt.length();
for (i = 0, j = 0; i < N && j < M; i++) {
if (txt.charAt(i) == pat.charAt(j)) j++;
else {
i -= j; // retrocesso por sobre o texto
j = 0;
}
}
if (j == M) return i - M;
else return N;
}