• DP编辑距离


    俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念。

    编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。 至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。 

    如果是: 
    abcde 
    acefg 
    最优对齐状态是: 
    abcde 
    a  c  efg 
    没有对上的列数是4,函数输出值为4。

    状态转移方程是:d[i][j] = min{ d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+(a[i]==b[j]? 0:1) }

    你看懂啦吗?

    d[i][j]表示s1的前i个和s2的前j个字符相等。

    初始状态为d[i][0]=i;d[0][i]=i;

    (1)d[i-1][j]表示s1的前i-1个字符和s2的前j个字符已经相同啦,此时可以在s1的后面加上s2的最后一个字符或者把s2最后的字符去掉,即此时d[i][j]=d[i-1][j]+1;

    (2)d[i][j-1]和(1)相同;

    (3)d[i-1][j-1]时分两种情况

    当s1[i]==s2[j]时,d[i][j]=d[i-1][j-1];

    当s1[i]!=s2[j]时,d[i][j]=d[i-1][j-1]+1;

     Hrbust 1284

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<string.h>
     5 using namespace std;
     6 char  s1[1005],s2[1005];
     7 int dp[1005][1005];
     8 int main()
     9 {
    10     int n;
    11     cin>>n;
    12     while(n--)
    13     {
    14         cin>>s1+1>>s2+1;
    15         int l1=strlen(s1+1);
    16         int l2=strlen(s2+1);
    17         dp[0][0]=0;
    18         for(int i=1;i<=l1;i++){
    19             dp[i][0]=i;
    20         }
    21         for(int i=1;i<=l2;i++){
    22             dp[0][i]=i;
    23         }
    24         for(int i=1; i<=l1; i++)
    25         {
    26             for(int j=1; j<=l2; j++)
    27             {if(s1[i]==s2[j])//if一定要紧接着for,顺序错啦就不对啦哦
    28                         dp[i][j]=dp[i-1][j-1];
    29                     else dp[i][j]=dp[i-1][j-1]+1;
    30                dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
    31                 dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
    32 
    33 
    34 
    35 
    36             }
    37         }
    38         cout<<dp[l1][l2]<<endl;
    39     }
    40     return 0;
    41 }
    View Code
    你若盛开,清风自来...
  • 相关阅读:
    Spring Boot简明教程之实现Web开发及常用参数获取方式分析
    SpringBoot 简明教程之项目属性配置(三):配置文件优先级及多配置切换
    史上最简单MySQL教程详解(进阶篇)之存储过程(二)
    史上最简单MySQL教程详解(进阶篇)之存储过程(一)
    文字从中间向两边延展
    字符串转化成驼峰命名
    统计字符串字符个数
    while求和(1到100)
    for循环实现乘阶
    递归遍历所有ul下的所有子节点
  • 原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5749168.html
Copyright © 2020-2023  润新知