题目描述
依旧是字符串处理,设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
删除一个字符;
插入一个字符;
将一个字符改为另一个字符。 对任给的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。
输入描述
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于200。
输出描述
只有一个正整数,为最少字符操作次数。
测试样例
输入
sfdxbqw
gfdgw
输出
4
解题思路
线性规划。
state[i][j]=Min(state[i-1][j-1]+(str1.at(i-1)==str2.at(j-1)?0:1),state[i-1][j]+1,state[i][j-1]+1);
#include<bits/stdc++.h>
using namespace std;
int getMin(int a, int b, int c){
int n = a<b?a:b;
return n<c?n:c;
}
int get(string str1,string str2){
int a = str1.length()+1;
int b = str2.length()+1;
int state[100][100];
for(int i = 0 ; i<a;i++){
state[i][0]=i;
}
for(int j = 0; j<b ; j++){
state[0][j] = j;
}
for(int i = 1 ; i<a;i++){
for(int j = 1; j<b ; j++){
state[i][j]=getMin(state[i-1][j-1]+(str1.at(i-1)==str2.at(j-1)?0:1),state[i-1][j]+1,state[i][j-1]+1);
}
}
return state[a-1][b-1];
}
int main(){
string str1,str2;
cin>>str1>>str2;
cout<<get(str1,str2)<<endl;
}