题目描述
- 最优包含
我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样。
给定两个字符串 S 和 T,请问最少修改 S 中的多少个字符,能使 S 包含 T?
输入格式
输入两行,每行一个字符串。
第一行的字符串为 S,第二行的字符串为 T。
两个字符串均非空而且只包含大写英文字母。
输出格式
输出一个整数,表示答案。
样例
输入样例:
ABCDEABCD
XAABZ
输出样例:
3
算法1
(暴力枚举) $O(n^2)$
dp
时间复杂度
参考文献
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1010;
int dp[N][N];
int main()
{
char qes1[N];
char qes2[N];
scanf("%s",qes1);
scanf("%s",qes2);
int l1=strlen(qes1);
int l2=strlen(qes2);
if(qes1[0]==qes2[0]) dp[0][0]=0;
else dp[0][0]=1;
for(int j=1;j<l1;j++)
{
for(int k=0;k<l2;k++)
{
if(k==0)
{
for(int h=0;h<j;h++){
if(qes1[h]==qes2[k]) dp[j][k]=-1;
}
if(dp[j][k]==-1) dp[j][k]=0;
else dp[j][k]=1;
continue;
}
if(j<k) continue;
if(qes1[j]==qes2[k]) dp[j][k]=dp[j-1][k-1];
else {
if(j==k) {
dp[j][k]=dp[j-1][k-1]+1;
}
else {
dp[j][k]=min(dp[j-1][k-1]+1,dp[j-1][k]);
}
}
}
}
cout<<dp[l1-1][l2-1]<<endl;
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
很好很好,我从中学到了很多
谢谢