回文字符串(51Nod-1092)
生活随笔
收集整理的這篇文章主要介紹了
回文字符串(51Nod-1092)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目
回文串是指aba、abba、cccbccc、aaaa這種左右對稱的字符串。每個字符串都可以通過向中間添加一些字符,使之變?yōu)榛匚淖址?br /> 例如:abbc 添加2個字符可以變?yōu)?acbbca,也可以添加3個變?yōu)?abbcbba。方案1只需要添加2個字符,是所有方案中添加字符數(shù)量最少的。
輸入
輸入一個字符串Str,Str的長度 <= 1000。
輸出
輸出最少添加多少個字符可以使之變?yōu)榛匚淖执?/p>
輸入樣例
abbc
輸出樣例
2
思路:由于要找最少添加的字符使得原字符串變?yōu)榛匚拇?#xff0c;那么先將給出的字符串反轉(zhuǎn),將兩字符串做 LCS,得到的是最大的公共子串的長度,那么用字符串長度減去最大公共子串長度就是最少添加字符的個數(shù)
源程序
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-12 #define INF 0x3f3f3f3f #define LL long long const int MOD=1000000007; const int N=1000+5; const int dx[]= {-1,1,0,0}; const int dy[]= {0,0,-1,1}; using namespace std; char str[N]; char reStr[N]; int dp[N][N]; int main() {scanf("%s",str+1);int len=strlen(str+1);for(int i=1,j=len; i<=len+1; i++,j--) {reStr[j]=str[i];}for(int i=1; i<=len; i++) {for(int j=1; j<=len; j++) {if(str[i]==reStr[j]) {dp[i][j]=dp[i-1][j-1]+1;} else {dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}}int res=len-dp[len][len];printf("%d\n",res);return 0; }?
總結(jié)
以上是生活随笔為你收集整理的回文字符串(51Nod-1092)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理论基础 —— 查找
- 下一篇: 靶形数独(信息学奥赛一本通-T1447)