Portanto, não tenho certeza absoluta, mas acho que você está pedindo para contar o número de cadeias de tamanho n (sobre o alfabeto {a,b}) onde o fator / substring aa não parece certo?
Nesse caso, existem algumas abordagens combinatórias que você pode adotar. Tanto o Yuval quanto o ADG apresentaram argumentos mais simples e intuitivos, então eu definitivamente sugiro que verifique suas respostas! Aqui está um dos meus favoritos: é um pouco estranho, mas é uma abordagem muito geral (e meio divertida).
Vamos começar com um idioma mais simples, o das palavras que começa e termina com b (também sem substrings de aa) Podemos olhar para uma string admissível (por exemplo,bbbababbbb) como uma lista de sequências de bs separados por singular as. Isso fornece a construção:
w = (b+uma)∗b+
Agora, como contamos frases que pertencem a esse idioma?
Vamos imaginar que estamos expandindo essas expressões. O quee∗denotar? Bem, é simplesmente
e∗= £ | e | e e | e e e | e e e e | ...
Agora, isso fará muito pouco sentido, mas vamos imaginar que
eé uma variável sobre algum campo numérico. Em particular, trataremos
ϵ → 1,
a ∣ b → a + be
a b c → a × b × c. Isso então diz que
e∗→ 1 + e + e e + e e e + …
Vamos tentar ver a motivação por trás dessa estranha interpretação. Isso é
quase uma transformação bijetiva. Em particular, queremos preservar a
contagem de cada
enpalavra que, como você pode ver facilmente, nós fazemos. No entanto, há uma diferença crucial entre as expressões de string e expressões numéricas: a multiplicação (concatenação em strings,
×em expressões numéricas) agora é comutativo! Intuitivamente, a comutatividade permite tratar todas as permutações da mesma palavra que a mesma; isto é, não desambiguamos entre a expressão
b b b a b e
b b a b b; ambos representam uma string com 4
bse um
uma. Portanto, essa transformação nos permite preservar a contagem de cada palavra de um determinado número de
umaareia
bs, mas agora nos permite fechar os olhos aos detalhes supérfluos com os quais não nos importamos.
Se você voltar ao pré-cálculo, poderá reconhecer esta série como 11 - e. Sei que não faz sentido reescrever essa expressão regular como uma função com valor numérico, mas apenas ficar nua comigo por um momento.
Similarmente, e+= ee∗→e1 - e. O que significa que podemos traduzirW para dentro
w→11−(b1−b×a)×b1−b
Por sua vez, podemos simplificar isso até
w ( a , b ) = b ×11 - ( b + b a )
Isso nos diz que o idioma W é isomórfico para o idioma b ( b ∣ a b)∗ (cuja tradução direta já está b1 - b - b a) sem precisar recorrer a ferramentas teóricas da linguagem! Esse é um dos poderes de tratar essas séries como funções de forma fechada: podemos realizar simplificações nelas que são quase impossíveis de executar de outra maneira, reduzindo-as a um problema mais simples.
Agora, se você ainda se lembra de algum curso de cálculo, se lembra de que certos tipos de funções (sendo suficientemente comportadas) admitem essas representações em série conhecidas como expansões de Taylor. Não se preocupe, não teremos que nos preocupar com esses conjuntos de problemas irritantes do Calc 1; Estou apenas apontando que essas funções podem ser representadas como a soma
w ( a , b )=∑i , jWeu jumaEubj
de modo a
Weu j fornece o número de palavras que satisfazem
W de tal forma que tem exatamente
i ocorrências de
a e
j ocorrências de
b. No entanto, não nos preocupamos particularmente se algo é um
a ou um
b. Em vez disso, apenas nos preocupamos com o número total de caracteres na sequência. Para fechar um "olho cego" entre
a e
b, podemos (literalmente) tratá-los da mesma forma, por exemplo, deixe
z=a=b e pegue
w(z)=w(z,z)=z1−z−z2=∑kwkzk
Onde wk conta o número de palavras satisfatórias de comprimento k.
Agora, tudo o que resta a fazer é encontrar wk. The usual combinatorial approach here would be to decompose this rational function into its partial-fraction: that is, given the denominator 1−z−z2=(z−ϕ)(z−ψ), we can rewrite z(z−ϕ)(z−ψ)=Az−ϕ+Bz−ψ (There's a bit of algebra involved here, but this is a universal property of rational (one polynomial dividing another) functions). To solve this, you can refactor
Az−ϕ+Bz−ψ=z(z−ϕ)(z−ψ)
which generates the constraints
A+B=1,Aψ+Bϕ=0. Irregardless of what
A and
B are, recall that
11−x=1+x+x2+…, well, we can rearrange
w(z)=−Aϕ−z+−Bψ−z=(−Aϕ)11−zϕ+(−Bψ)11−zψ=(−Aϕ)(1+ϕ−1z+ϕ−2z2+…)+(−Bψ)(1+ψ−1z+ψ−2z2+…)
therefore
wk=(−Aϕ)ϕ−k+(−Bψ)ψ−k
Here,
ϕ is the golden ratio
1+5√2 and
ψ=−ϕ−1 is its conjugate. We then have an easy description of the asymptotic behavior of the
w language: it runs in
Θ(ϕn). In fact, if you expand everything out, you'll find that
wk=ϕk−ψk5–√=⌈ϕk5–√⌉
There's also an intricate connection to another common combinatorial class. This is just the Fibonacci numbers!
Now, suppose you have wk, which counts the number of strings of size k that starts and ends with k (and also contains no aa substrings), how can we build a string that can start or end with an a? Well, it's simple: an admissible string is either in w (starts and ends with b), or it is aw (starts with a), or it is wa (ends with a), or it is awa (starts and ends with a). Therefore:
f(n)=wn+wn−2+2∗wn−1
Recall that
wn is the fibonacci sequence, so
wn−1+wn−2=wn, which means that
f(n)=(wn+wn−1)+(wn−2+wn−1)=wn+1+wn=wn+2
Therefore,
f(n)=fib(n+2)=⌈ϕn+25√⌉
Now you probably don't have to do this analysis, but just by having the insight that this sequence is a shifted Fibonacci sequence ought to give you an idea of some other combinatorial interpretations that you can try.