描述
-
输入
-
第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出
- 每行输出所需添加的最少字符数 样例输入
-
1 Ab3bd
样例输出
-
2
-
思路:将字符串逆置,然后求出与原串的最长公共子序列len【http://blog.csdn.net/xllfy123/article/details/52887086】,用原串的长度减len就得到结果了
-
关于字符串的逆置:(1)reverse(str1.begin(),str1.end()):把s1逆置,逆置串替换掉原来的s1
-
(2)str2.assign(str1.rbegin(),str1.rend()):str1逆置,逆置串保存在str2中
-
#include<iostream> #include<algorithm> #include<cstring> using namespace std; string s1,s2; int dp[1001][1001]; int LCS(int len1,int len2) { memset(dp,0,sizeof(dp)); for(int i=0; i<=len1; i++) for(int j=0; j<=len2; j++) { if(i==0||j==0) dp[i][j]=0; else if(s1[i-1]==s2[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } return dp[len1][len2]; } int main() { int n; cin>>n; while(n--) { cin>>s1; int len=s1.length(); s2.assign(s1.rbegin(),s1.rend()); int l= LCS(s1.length(),s2.length()); cout<<len-l<<endl; } return 0; }