代码思路
代码采用的是**最长公共子序列(LCS)**的思路:
-
将原字符串反转得到新字符串
-
求原字符串和反转字符串的最长公共子序列长度
-
答案 = 原字符串长度 - 最长公共子序列长度
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1002][1002];//表示s的前i个字符和r的前j个字符的LCS长度
string s;//原始字符串
char r[1002];//存放反转后的字符串
int k;
int main(){
cin>>s;
//将原始字符串反转,存放到r数组
for(int i=s.length()-1;i>=0;i--){
r[k++]=s[i];
}
//求最长公共子序列
for(int i=1;i<=s.length();i++){//i遍历原字符串每个字符
for(int j=1;j<=strlen(r);j++){//j遍历反转后的字符串
if(s[i-1]==r[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<s.length()-dp[s.length()][strlen(r)]<<endl;
return 0;
}