題目以下:ios
Problem Description 最近鬱悶的汪歐濤遇到了一個難題,他的隊友小成成給了他一道問題,對於一串隨機的字符串(均由小寫字母組成),去掉任意位置上任意數量的字符,能夠獲得的最長的迴文串長度是多少,這可把汪歐濤給難住了,你做爲他的好朋友,你能幫他解決這個問題嗎? ps:「迴文串」是一個正讀和反讀都同樣的字符串,例如「abcba」,「a」,「adeeda」是迴文串,而「abcd」,‘adc’不是。 Input 輸入多組字符串,每組字符串皆由小寫字母組成,每組字符串的長度不超過10。 Output 對於每組字符串,輸出一個整數在一行,表明其能組成的迴文串的最大長度。 Sample Input abca abdefacaed aaaaaaaaaa Sample Output
3 7 10
思路: 能夠用一個相似於二進制的數組存儲,a[i]=0則表示第i個位置不出現,1則出現(此處我還用了遞歸,其實10個for應該也是能過的,畢竟數據有點小)數組
AC代碼:spa
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[20]; bool vis[20]; int ans,len; void find() { int temp,cnt=0,r=1,l=len,fag=1; for (int i=1;i<=len;i++){ if (vis[i]) cnt++; } while (r<=l){ // cout<<r<<"\t"<<l<<endl; while (vis[r]==0&&r<=l){ r++; } while (vis[l]==0&&r<=l){ l--; } if (r<=l&&s[r]!=s[l]){ fag=0; break; } else{ r++; l--; } } if (fag) ans=ans>cnt?ans:cnt; } void check(int pos){ // cout<<"1*"<<endl; if (pos>len+1) return ; if (pos==len+1){ find(); return ; } vis[pos]=true; check(pos+1); vis[pos]=false; check(pos+1); return ; } int main() { while(cin>>s+1){ memset(vis,true,sizeof(vis)); len=strlen(s+1); check(1); cout<<ans<<endl; } return 0; }