1. 程式人生 > >回溯法,判斷字串字尾

回溯法,判斷字串字尾

題意為給你一個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); }