找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2375|回复: 0

计算字符串相似度

[复制链接]
发表于 2014-9-2 22:42:58 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
编程之美 3.3节计算字符串相似度问题我找到了一种非递归方式
题目要求为:可以通过增、删、替换三种方式作为一次改变,对于给定2个字符串,最少需要多少次变换可以变成另一个字符串。
应用动态规划方法:F[i,j]=min{F[i-1,j],F[i,j-1],temp}+1;
temp取值为:
F[i-1,j-1]    S1 != S2[j]
F[i-1,j-1]-1  S1 == S2[j]

代码为:

  1. #include <iostream>
  2. using namespace std;

  3. #define min(x,y) ((x<y)?x:y)
  4. #define arr(x,y) arr[(x)*size2+(y)]

  5. void main()
  6. {
  7.         char s1[]="xfdfa";
  8.         char s2[]="xabcdae";

  9.         int size1=sizeof(s1)-1;
  10.         int size2=sizeof(s2)-1;
  11.         int* arr=new int[size1*size2];
  12.         int i,j;

  13.         //初始化角元
  14.         bool matched=false;
  15.         if(*s1 == *s2)
  16.         {
  17.                 matched=true;
  18.                 arr(0,0)=0;
  19.         }
  20.         else
  21.         {
  22.                 arr(0,0)=1;
  23.         }

  24.         //初始化首行
  25.         for(i=1;i<size1;i++)
  26.         {
  27.                 arr(i,0)=arr(i-1,0);
  28.                 if(!matched && (*s2 == s1[i]))
  29.                 {
  30.                         matched=true;
  31.                 }
  32.                 else
  33.                 {
  34.                         arr(i,0)++;
  35.                 }
  36.         }

  37.         //初始化首列
  38.         if(*s1 != *s2)
  39.         {
  40.                 matched=false;
  41.         }
  42.         for(i=1;i<size2;i++)
  43.         {
  44.                 arr(0,i)=arr(0,i-1);
  45.                 if(!matched && (*s1 == s2[i]))
  46.                 {
  47.                         matched=true;
  48.                 }
  49.                 else
  50.                 {
  51.                         arr(0,i)++;
  52.                 }
  53.         }

  54.         for(i=1;i<size1;i++)
  55.         {
  56.                 for(j=1;j<size2;j++)
  57.                 {
  58.                         int t1=min(arr(i-1,j),arr(i,j-1));
  59.                         int t2=arr(i-1,j-1);
  60.                         if(s1[i] == s2[j])
  61.                                 t2--;
  62.                         arr(i,j)=min(t1,t2)+1;
  63.                 }
  64.         }

  65.         cout<<arr(size1-1,size2-1)<<endl;

  66.         delete []arr;
  67. }
复制代码
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-27 11:24 , Processed in 0.033578 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表