• 大小: 6KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-09-09
  • 语言: C/C++
  • 标签:

资源简介

*问题描述:设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。 * 这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; * (3)将一个字符改为另一个字符。将字符串A变换为字符串B 所用的最少 * 字符操作数称为字符串A到B 的编辑距离,记为 d(A,B)。试设计一个有效 * 算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。 * 例如: * 输入第一个字符串: * shao * 输入第二个字符串: * shaod * 最短编辑距离 * 1 (2)本题思路分析 * 定义两个字符串s1 ,s2 * 比较两字符串的某两个相同位置时:(例如s1[i] s2[j] 这时i=j)有三种办法 * 1.把字符ch1变成ch2, 使得s1与s2字符串在该处相同 * 2.删除s1当中的该字符ch1,使得s1与s2字符串在该处相同 * 3.插入某个字符ch2,使得s1与s2字符串在该处相同 运行结果: * 请输入字符串1 * shao * 请输入字符串2 * sha1 * d[1][1]= 0 d[1][2]= 1 d[1][3]= 2 d[1][4]= 3 * * d[2][1]= 1 d[2][2]= 0 d[2][3]= 1 d[2][4]= 2 * * d[3][1]= 2 d[3][2]= 1 d[3][3]= 0 d[3][4]= 1 * * d[4][1]= 3 d[4][2]= 2 d[4][3]= 1 d[4][4]= 1 * * 最短编辑距离为: 1 * 请按任意键继续. . .

资源截图

代码片段和文件信息

/******************************************************************************
                         动态规划--最短编辑问题                                                        
*******************************************************************************/ 


/* 
*问题描述:设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。
*          这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; 
*          (3)将一个字符改为另一个字符。将字符串A变换为字符串B 所用的最少
*          字符操作数称为字符串A到B 的编辑距离,记为 d(AB)。试设计一个有效
*          算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(AB)。
*          例如:
*          输入第一个字符串: 
*          shao
*          输入第二个字符串: 
*          shaod 
*          最短编辑距离
*          1 
*
*分析:    (1)选择动态规划的理由:
*          由于该问题是计算最短编辑问题的,要求两个字符串的最短编辑距离时,当     
*          该字符串的子串满足最短编辑距离的时候,那么该字符串也就会满足,但是
*          如何得到子串的最短编辑距离呢?我们可以考虑用回溯法来求,可是回溯法的 
*          缺点是会求出所有可能的路线,当求子串d[i][j]子串的时须求出d[i-1][j-1] 
*          然而该子串d[i-1][j-1] 已经在求d[i-1] [j]的时候求过,用递推的思想还有
*          记忆化的搜索的情况下,我就考虑到了用动态规划。 并且由于该结构具有
*          重叠子问题。再加上所具有的最优子结构。符合动态规划算法基本要素。因此
*          可以使用动态规划算法把复杂度降低到多项式级别。

*          
*          (2)本题思路分析
*          定义两个字符串s1 s2 
*          比较两字符串的某两个相同位置时:(例如s1[i] s2[j] 这时i=j)有三种办法 
*          1.把字符ch1变成ch2, 使得s1与s2字符串在该处相同
*          2.删除s1当中的该字符ch1,使得s1与s2字符串在该处相同 
*          3.插入某个字符ch2,使得s1与s2字符串在该处相同 
*           
*          (3).首先为了避免重复计算子问题,添加两个辅助数组。
*             <1> 保存子问题结果。
*                 d[ |s1| |s2| ]  其中d[ i  j ] 表示子串 s1(0->i) 与 s2(0->j)
*                 的编辑距离
*             <2> 保存字符之间的编辑距离.
*                 cost 其中 cost= s[ch1] = s[ch2] ? 0 : 1
*          (4)编辑距离的性质
*          计算两个字符串s1+ch1 s2+ch2的编辑距离有这样的性质:
*          <1>.d(s1””) = d(“”s1) = |s1|  当某一个字符串为空时,最短编辑距离
*              是另外一个字符串的长度。    
*              d(“ch1””ch2”) = ch1 == ch2 ? 0 : 1; 当比较两个字符之间的距离
*              时,若两字符相同编辑距离为0,不相同的情况编辑距离为1 
*          <2>.由于我们定义的三个操作来作为编辑距离的一种衡量方法。
*              于是对ch1ch2可能的操作只有
*              1.把ch1变成ch2   因此当ch1==ch2时,d(s1+ch1s2+ch2)  = d(s1s2)
*                                   当ch1!=ch2时,d(s1+ch1s2+ch2)  = d(s1s2)+1 
*              2.s1+ch1后删除ch1              d = (1+d(s1s2+ch2))
*              3.s1+ch1后插入ch2              d = (1 + d(s1+ch1s2))
*              对于2和3的操作可以等价于:
*              2.s2+ch2后添加ch1              d=(1+d(s1s2+ch2))
*              3.s2+ch2后删除ch2              d=(1+d(s1+ch1s2))
*               
*
*              因此:d(s1+ch1s2+ch2) = min(  d(s1s2)+ ch1==ch2 ? 0 : 1 
*                                             d(s1+ch1s2)
*                                             d(s1s2+ch2)  );     
*          
*          
*          (5).新的计算表达式
*              
*              d[ 00

评论

共有 条评论

相关资源