回溯法,判断字符串后缀
题意为给你一个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);
}