这一题类似于距离编辑,所以我们首先来看看什么是编辑距离。
题目 2141: [信息学奥赛一本通-T1276 ]编辑距离 https://www.dotcpp.com/oj/problem2141.html
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符。
对任意的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。
解决思路:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int Max_N = 2e3+10; char A[Max_N],B[Max_N]; int dp[Max_N][Max_N]; int main() { scanf("%s%s",A+1,B+1);//下标从1开始 便于操作 int len_A = strlen(A+1), len_B = strlen(B+1); //边界情况 dp[0][0] = 0; for( int i=1; i<=len_A; i++ ) dp[i][0] = i; for( int j=1; j<=len_B; j++ ) dp[0][j] = j; //递推式 for( int i=1; i<=len_A; i++ ) { for( int j=1; j<=len_B; j++ ) { int temp = min( dp[i][j-1], dp[i-1][j] ) + 1; int d = A[i]==B[j] ? 0 : 1; dp[i][j] = min( temp, dp[i-1][j-1]+d ); } } printf("%d ",dp[len_A][len_B]); return 0; }
最优包含 https://www.acwing.com/problem/content/2555/
我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样。
给定两个字符串 S 和 T,请问最少修改 S 中的多少个字符,能使 S 包含 T?
解题思路:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF = 1e8+10; const int Max_N = 1e3+10; char S[Max_N],T[Max_N]; int dp[Max_N][Max_N]; int main() { scanf("%s%s",S+1,T+1); int len_S = strlen(S+1), len_T = strlen(T+1); //初始化 dp[0][0] = 0; for( int i=1; i<=len_S; i++ ) dp[i][0] = 0; for( int j=1; j<=len_T; j++ ) dp[0][j] = INF; //递推 for( int i=1; i<=len_S; i++ ) { for( int j=1; j<=len_T; j++ ) { int d = S[i]==T[j] ? 0 : 1; dp[i][j] = min( dp[i-1][j], dp[i-1][j-1]+d ); } } printf("%d ",dp[len_S][len_T]); return 0; }
参考连接 https://www.cnblogs.com/biyeymyhjob/archive/2012/09/28/2707343.html