wustoj1889编辑距离
来源:互联网 发布:手机淘宝我的店铺在哪 编辑:程序博客网 时间:2024/05/29 18:50
Description
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符。
对任的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。
Input
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于200。
Output
一个正整数,为最少字符操作次数。
Sample Input
sfdqxbwgfdgw
Sample Output
4
分析:字符串a通过增删改三种方式变为b,用dp[i][j]表示a的前i个字符变成b的前j个字符需要的次数。很显然的背包问题,如果a的第i个字符和b的第j个字符相等的话,不做修改dp[i][j] = dp[i-1][j-1],反之,dp[i][j] = min( min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1)。
参考代码:
#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<map>#include<vector>#include<iostream>using namespace std;const int maxn = 200+10;char a[maxn];char b[maxn];int dp[maxn][maxn];int main(){ while( ~scanf("%s%s",a,b)) { int lena = strlen(a); int lenb = strlen(b); memset(dp,0,sizeof(dp)); //b为空串 删除前i个字符 for( int i = 1; i <= lena; i++) dp[i][0] = i; //a为空串 添加前i个字符 for( int i = 1; i <= lenb; i++) dp[0][i] = i; for( int i = 1; i <= lena; i++) { for( int j = 1; j <= lenb; j++) { if( a[i-1] == b[j-1])//相等的话不做改变 dp[i][j] = dp[i-1][j-1]; else//不相等 删减a 或删减b 或改a[i]到b[i] dp[i][j] = min( min(dp[i-1][j]+1,dp[i][j-1]+1),dp[i-1][j-1]+1); } } printf("%d\n",dp[lena][lenb]); } return 0;}
0 0
- wustoj1889编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 编辑距离
- 数据结构——树(1):树的基本概念,二叉树、完全二叉树、满二叉树、搜索二叉树
- ConstraintLayout约束控件详解
- qt4.8+Phonon播放.wav声音文件
- 模拟实现简易shell
- PAT 1006
- wustoj1889编辑距离
- CSS根据屏幕大小控制隐藏与显示
- 【设计模式】面向对象
- JavaAPI中的<T>和<E>分别代表什么?
- 从并发处理谈PHP进程间通信(二)System V IPC
- HashMap的工作原理
- Struts2防止表单重复提交
- 解决CentOS 7.0/7.1/7.2/7.3在VMware虚拟机中没有网卡
- Spring 事务管理详解