题目描述
思路分析
线性DP
f
[
i
]
[
j
]
:
a
字
符
串
的
1
−
i
按
顺
序
变
成
b
字
符
串
的
1
−
j
的
最
小
操
作
数
f[i][j]:a字符串的1-i按顺序变成b字符串的1-j的最小操作数
f[i][j]:a字符串的1−i按顺序变成b字符串的1−j的最小操作数
分
为
三
种
操
作
:
a
删
去
最
后
一
个
字
符
,
a
在
最
后
增
加
一
个
字
符
,
a
修
改
最
后
一
个
字
符
。
分为三种操作:a删去最后一个字符,a在最后增加一个字符,a修改最后一个字符。
分为三种操作:a删去最后一个字符,a在最后增加一个字符,a修改最后一个字符。
初
始
化
:
f
[
0
]
[
i
]
=
f
[
i
]
[
0
]
=
i
;
初始化:f[0][i]=f[i][0]=i;
初始化:f[0][i]=f[i][0]=i;
转
移
方
程
:
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
j
−
1
]
+
1
,
f
[
i
−
1
]
[
j
]
+
1
,
f
[
i
−
1
]
[
j
−
1
]
+
(
a
[
i
]
!
=
b
[
i
]
)
)
转移方程:f[i][j]=min(f[i][j-1]+1,f[i-1][j]+1,f[i-1][j-1]+(a[i]!=b[i]))
转移方程:f[i][j]=min(f[i][j−1]+1,f[i−1][j]+1,f[i−1][j−1]+(a[i]!=b[i]))
代码实现
class Solution {
public:
int minDistance(string a, string b) {
int n=a.size(),m=b.size();
vector<vector<int>> f(n+1,vector<int>(m+1));
a=" "+a;
b=" "+b;
for(int i=0;i<=n;i++) f[i][0]=i;
for(int i=1;i<=m;i++) f[0][i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
f[i][j]=min(f[i-1][j],f[i][j-1])+1;
f[i][j]=min(f[i][j],f[i-1][j-1]+(a[i]!=b[j]));
}
return f[n][m];
}
};