sdutoj1225--编辑距离(dp:字符串转化)

编辑距离

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

假设字符串的基本操作仅为:删除一个字符、插入一个字符和将一个字符修改成另一个字符这三种操作。

我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作。

下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通过上述的基本操作,我们可以把a变成b或b变成a,那么字符串a变成字符串b需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离。

例如:a="ABC",b="CBCD",则a与b的编辑距离为2。

你的任务就是:编一个快速的程序来计算任意两个字符串的编辑距离。

输入

输入包含多组测试数据。每组测试数据一行,为字符串A和字符串B。

字符串的长度不大于1024,且全为字母。

输出

编辑距离。

示例输入

ABC CBCD

示例输出

2

提示

来源

ZJGSU

由a串变为b串,三种操作,写成二维的dp后,dp[i][j]代表a串匹配到i,b串匹配到j时一共需要的步数。

如果s1[i] == s2[j]那么直接可以从 dp[i-1][j-1]得到,或是dp[i-1][j]+1代表添加一个字符,dp[i][j-1]+1代表删除一个字符中得到

如果不相同,那么和上面相同,只需要变化为dp[i-1][j-1]+1代表修改一个字符。

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

char s1[1200] , s2[1200] ;

int dp[1200][1200] ;

int main()

{

int i , j , l1 , l2 ;

while(scanf("%s %s", s1, s2)!=EOF)

{

memset(dp,0,sizeof(dp));

l1 = strlen(s1) ;

l2 = strlen(s2) ;

for(i = 0 ; i <= l1 ; i++)

dp[i][0] = i ;

for(j = 0 ; j <= l2 ; j++)

dp[0][j] = j ;

for(i = 1 ; i <= l1 ; i++)

{

for(j = 1 ; j <= l2 ; j++)

{

if( s1[i-1] == s2[j-1] )

dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j]+1,dp[i][j-1]+1) );

else

dp[i][j] = min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1) ) ;

}

}

printf("%d\n", dp[l1][l2]);

}

return 0;

}

时间: 2024-07-29 01:29:44

sdutoj1225--编辑距离(dp:字符串转化)的相关文章

poj3356 字符串的最小编辑距离 dp

poj3356 字符串的最小编辑距离  dp AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10895   Accepted: 4188 Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given bel

HDU 4323 Magic Number(编辑距离DP)

http://acm.hdu.edu.cn/showproblem.php?pid=4323 题意: 给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个串可以转化为询问中给的串. 思路: 明显的编辑距离DP,直接暴力过了,网上有用bk树的,可惜我不会. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6

POJ 3356 AGTC 最短编辑距离 DP

http://poj.org/problem?id=3356 题意: 给两个长度不大于1000的串,修改其中一个串使得两串相同,问最少修改次数.修改有三种,插入一个字符,删除一个字符,改变一个字符. 分析: 直接给方程. dp[i][j]表示第一个串前i位和第二串前j位匹配的最小修改次数. dp[0][0] = 0, dp[length(x)][length(y)]为答案. dp[i][j] = min(dp[i-1][j-1] + x[i] != y[j], dp[i-1][j] + 1, d

字符串转化为数字相加输出

设计思想:将字符串转化为数字,然后相加,最后输出和. 程序流程图: 源程序代码: public class JavaAdd { public static void main(String[] args){ String str1 = "12"; String str2 ="23"; int toInt1= 0 ; int otherInt=0 ; int taInt=0; toInt1 = Integer.parseInt(str1); otherInt = In

oc 之中的 汉字字符串转化成为拼音 汉字字符串的排序

在oc 之中的字符串为汉字的时候,我们经常要进行字符串比較,可是汉字不能比較,所以就要将汉字转化成为拼音,详细步骤例如以下: //可变字符串 必须是可变字符串. NSMutableString *mutableString = [NSMutableString stringWithString:@"小明"]; //转成带声调的拼音 CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformT

laravel 将数组转化成字符串 再把字符串转化成数组

这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组.   方法有点笨, 但是最后是解决了阮少翔的问题 $re1 = DB::table('admin_user') ->join('admin_role_user','admin_user.id','=','admin_role_user.user_id') ->select('admin_role_use

JS解析json数据(如何将json字符串转化为数组)

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2 <HTML> 3 <HEAD> 4 <TITLE> New Document </TITLE> 5 6 <SCRIPT LANGUAGE="JavaScript"> 7 8 var t="{'firstName': 'cyra', 'lastName':

将数字字符串转化为对应数字输出(不考虑溢出)

使用c语言编写一个函数,将一个数字字符串转化为对应数字,不考虑溢出,(比如"12.34"转换为数字:12.34),考虑异常输入 思考:异常如输入字幕等等,也有可能输入'+','-'号等, 程序如下: #include<stdio.h> #include<stdlib.h> #include<assert.h> double my_atof(const char* str) { assert(str); double num = 0; int flag

将字符串转化为数字的python实现

将字符串转化为数字的python实现 将字符串转化为数字的python实现,例如将字符串"1234567.8"转化为 1234567.8 这也是学习python中的一个简单的练习题,代码如下: # coding=UTF-8 将字符串转化为数字 from functools import reduce import math def char2int(s): return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9'

剑指offer 把字符串转化为整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路:字符串转化为整数的方法num = num * 10 + str[i] - '0':特殊情况:1.输入字符串为NULL: 2.输入字符串只有+/-: 3.转化的数字大于最大值或小于