题目描述
我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样。
给定两个字符串 S 和 T,请问最少修改 S 中的多少个字符,能使 S 包含T ?
输入
输入两行,每行一个字符串。第一行的字符串为 S,第二行的字符串为 T。两个字符串均非空而且只包含大写英文字母。
输出
输出一个整数,表示答案。
样例输入复制
ABCDEABCD XAABZ
样例输出复制
3
提示
对于 20% 的评测用例,1 ≤ |T| ≤ |S | ≤ 20;
对于 40% 的评测用例,1 ≤ |T| ≤ |S | ≤ 100;
对于所有评测用例,1 ≤ |T| ≤ |S | ≤ 1000。
解题思路
套用动态规划模板,不断试错
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char S[N],T[N];
int dp[N][N];
int main(){
memset(dp,0x4f,sizeof(dp)); //求最小值赋最大值
dp[0][0]=0; //初始化[0][0];
cin>>S+1;
cin>>T+1;
int ls=strlen(S+1);
int lt=strlen(T+1);
for(int i=1;i<=ls;i++){
dp[i][0]=0; //每次初始化第一个背包
for(int j=1;j<=lt;j++){
//以下就是写出基本模板去试错了
dp[i][j]=dp[i-1][j];
if(S[i]==T[j])
dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
else
dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);
}
}
cout<<dp[ls][lt];
}