Busca de substring

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:

Introdução

Regras do jogo

Exercícios 1

  1. Qual a solução do problema se M == 0?  Qual a solução do problema se M > N?
  2. (SW 5.3.4) M brancos consecutivos. Escreva um método eficiente que receba uma string txt e um inteiro M como argumentos e devolva a posição da primeira ocorrência de M espaços em branco consecutivos em txt (ou devolva txt.length se não houver tal ocorrência). Estime o número de comparações de caracteres usado pelo seu método, em texto típico e no pior caso.
  3. Quantas vezes o padrão  abcab  ocorre no texto  xxxabcabcabxxxx?

Algoritmo de força bruta

Exercícios 2

  1. Quais são os invariantes da primeira versão do algoritmo de força bruta?  Quais são os invariantes da segunda versão?
  2. O método search de força bruta está correto quando M == 0?  Está correto quando M > N?
  3. (SW 5.3.16b)  Faça um rastreamento do método search() de força bruta para o padrão  A B A B A B A B  e o texto  A B A B A B A B A A B A B A B A B A A A A A A A A.
  4. (SW 5.3.1)  Escreva uma classe Java, digamos Brute, em torno do método search() de força bruta discutido acima.
  5. (SW 5.3.15)  Escreva uma versão searchRL do método search() que percorra o padrão da direita para a esquerda.
  6. (SW 5.3.14)  Escreva uma versão do método search() de força bruta que use vetores de caracteres em lugar do tipo String para representar o padrão e o texto.
  7. (SW 5.3.7)  Acrescente à implementação de força bruta um método count() que conte o número de ocorrências do padrão e um método searchAll() que imprima todas as ocorrências.
  8. (SW 5.3.24.a) Todas as ocorrências. Escreva um método findAll() que encontre todas as ocorrêcias do padrão no texto.
  9. (SW 5.3.28) Armazenamento temporário (buffering). Escreva um método search() que receba um fluxo de entrada (do tipo In) como argumento e procure um padrão pat no fluxo. Dica: Você precisa ter um buffer para guardar pelo menos os M caracteres anteriores do fluxo de entrada. O seu desafio é escrever código eficiente para inicializar, atualizar e esvaziar o buffer.