时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
- 输入
- 第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000. - 输出
- 每行输出所需添加的最少字符数
- 样例输入
-
1 Ab3bd
- 样例输出
-
2
View Code1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #define Max 1010
5 #define min(a,b) ((a)>(b)? (b):(a))
6 using namespace std;
7 char ch[Max];
8 int d[Max][Max];
9 int dp(int l,int r)
10 {
11 int ans;
12 if(d[l][r]!=-1)
13 return d[l][r];
14 if(l>=r)
15 return 0;
16 if(ch[l]==ch[r])
17 ans=d[l+1][r-1]=dp(l+1,r-1);
18 else
19 {
20 d[l+1][r]=dp(l+1,r);
21 d[l][r-1]=dp(l,r-1);
22 ans=min( d[l+1][r]+1 , d[l][r-1]+1 );
23 }
24 return d[l][r]=ans;
25 }
26 int main()
27 {
28 int n,len;
29 cin>>n;
30 while(n--)
31 {
32 scanf("%s",ch);
33 memset(d,-1,sizeof(d));
34 len=strlen(ch)-1;
35 printf("%d\n",dp(0,len));
36 }
37 return 0;
38 }