思路
第一反应是最长公共子序列乱搞。。显然不对啊
我们令dp[i][j]为从s1(1,i)转换到s2(1,j)所需要的最少步数。分四种情况讨论:
- 插入:dp[i][j]=min(dp[i][j],dp[i][j-1]+1),我们已经知道从s1(1,i)转换到s2(1,j-1),所以在j-1尾插入字来尝试更新dp[i][j]
- 删除:dp[i][j]=min(dp[i][j],dp[i-1][j]+1),我们已经知道从s1(1,i-1)转换到s2(1,j),因为已经转换完成,所以i比之前i-1的状态只需要删去一个字符就能变成s2(1,j)
- 替换:dp[i][j]=dp[i-1][j-1]+1,转移显而易见
- 不变:dp[i][j]=dp[i-1][j-1],同样是转移显而易见。
最后打印路径即可,因为这里操作可逆
代码
1 |
|