回溯法,判斷字串字尾
阿新 • • 發佈:2018-11-23
題意為給你一個n,k讓你輸出由前k個字母組成的第n個困難字串,困難字串就是沒有任何兩個相鄰的字串完全相同,例如BB,ABCDABCD不是,而A AB ABA ABAC ABACA ABACAB ABACABA為困難的串
例如當n=7,k=3時輸出ABACABA。
解決這個問題就是要避免重複的判斷,當已經判斷好長度為len的字串為困難字串時,再判斷長度為len+1的字串時只需要比較len+1的字串的所有後綴字串是否產生重複即可,例如ABAC先比較後C和A,然後再比較AC AB。
#include<bits/stdc++.h>
using namespace std;
int n,l;
char a[1000];
bool ok(int n, char a[])
{
for(int cnt=1; cnt*2<=n; cnt++)
{
int flag=0;
for(int k=0; k<cnt; k++)
{
if(a[n-k]!=a[n-k-cnt])
{
flag=1;
}
}
if(flag==0)
return false;
}
return true;
}
int ans=0;
void dfs(int step)
{
if(ans==n)
return;
for(int i=1; i<=k; i++)
{
a[step]='a'+i-1;
if(ok(step,a))
{
for(int j=1; j<=n; j++)
printf("%c", a[j]);
printf("\n");
ans++;
if(ans==n)
return;
dfs(step+1);
if(ans==n)
return;
}
}
}
int main()
{
scanf("%d%d", &n, &k);
dfs(1);
}