编程之美——计算字符串相似度

方法一:使用递归思想

代码:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4
 5 int minValue(int t1,int t2,int t3);
 6 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend);
 7
 8 int main()
 9 {
10     string strA="hello";
11     string strB="hi";
12     cout<<calculateStringDistance(strA,0,strA.size(),strB,0,strB.size());
13     return 0;
14 }
15
16 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend)
17 {
18     if(pAbegin>pAend)
19     {
20         if(pBbegin>pBend)
21             return 0;
22         else
23             return pBend-pBbegin+1;
24     }
25     if(pBbegin>pBend)
26     {
27         if(pAbegin>pAend)
28             return 0;
29         else
30             return pAend-pAbegin+1;
31     }
32
33     if(strA[pAbegin]==strB[pBbegin])
34         return calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);
35     else
36     {
37         int t1=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);
38         int t2=calculateStringDistance(strA,pAbegin,pAend,strB,pBbegin+1,pBend);
39         int t3=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin,pBend);
40         return minValue(t1,t2,t3)+1;
41     }
42 }
43
44 int minValue(int t1,int t2,int t3)
45 {
46     int t=min(t1,t2);
47     return min(t,t3);
48 }

上面的递归程序中,有些数据被重复计算了,可以使用一个二维数组存储递归过程中间值,避免不必要的递归过程

方法二:

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 using namespace std;
 5
 6 int minValue(int t1,int t2,int t3);
 7 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend);
 8
 9 int momoDistance[100][100];
10
11 int main()
12 {
13     string strA="abcdfef";
14     string strB="f";
15     memset(momoDistance,0,sizeof(momoDistance));
16
17     cout<<calculateStringDistance(strA,0,strA.size()-1,strB,0,strB.size()-1);
18
19     return 0;
20 }
21
22 int calculateStringDistance(string strA,int pAbegin,int pAend,string strB,int pBbegin,int pBend)
23 {
24     if(pAbegin>pAend)
25     {
26         if(pBbegin>pBend)
27             return 0;
28         else
29             return pBend-pBbegin+1;
30     }
31     if(pBbegin>pBend)
32     {
33         if(pAbegin>pAend)
34             return 0;
35         else
36             return pAend-pAbegin+1;
37     }
38
39     if(strA[pAbegin]==strB[pBbegin])
40     {
41         if(momoDistance[pAbegin+1][pBbegin+1]!=0)
42             return momoDistance[pAbegin+1][pBbegin+1];
43         else
44         {
45             momoDistance[pAbegin+1][pBbegin+1]=
46             calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);
47             return momoDistance[pAbegin+1][pBbegin+1];
48         }
49     }
50     else
51     {
52         int t1,t2,t3;
53         if(momoDistance[pAbegin+1][pBbegin+1]!=0)
54             t1=momoDistance[pAbegin+1][pBbegin+1];
55         else
56         {
57             t1=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin+1,pBend);
58             momoDistance[pAbegin+1][pBbegin+1]=t1;
59         }
60
61         if(momoDistance[pAbegin+1][pBbegin]!=0)
62             t2=momoDistance[pAbegin+1][pBbegin];
63         else
64         {
65             t2=calculateStringDistance(strA,pAbegin+1,pAend,strB,pBbegin,pBend);
66             momoDistance[pAbegin+1][pBbegin]=t2;
67         }
68
69         if(momoDistance[pAbegin][pBbegin+1]!=0)
70             t3=momoDistance[pAbegin][pBbegin+1];
71         else
72         {
73             t3=calculateStringDistance(strA,pAbegin,pAend,strB,pBbegin+1,pBend);
74             momoDistance[pAbegin][pBbegin+1]=t3;
75         }
76
77         return minValue(t1,t2,t3)+1;
78     }
79 }
80
81 int minValue(int t1,int t2,int t3)
82 {
83     int t=min(t1,t2);
84     return min(t,t3);
85 }

memset函数说明

以字节为单位对指向内存的4个字节赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就00000001,所以用memset对非字符型数组赋初值是不可取的!但是可以当作清零函数;

时间: 2024-10-09 01:10:51

编程之美——计算字符串相似度的相关文章

编程之美---计算字符串的相似度

对于不同的字符串,判断其相似程度.可以修改一个字符,增加一个字符,删除一个字符等操作. 分析:当两个字符串第一个字符相等时,直接把两个字符串跳到第二个位置开始比较就可以了.当两个字符串第一个字符不相等时,不管怎么操作总是,要么第一个串跳到第二个位置,第二个串位置不变:或者第一个串位置不变,第二个跳到第二个位置:或者两个串都跳到第二个位置(同过修改串的字符).于是就可以写个递归程序处理. 1 int calculateStringDistance(string strA, int pABegin,

编程之美之字符串移位包含问题

[题目] 给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含.例如,S1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回false. [分析] [思路一] 从题目中可以看出,我们可以使用最直接的方法对S1进行循环移动,再进行字符串包含的判断,从而遍历其所有的可能性. 字符串循环移动,时间复杂度为O(n),字符串包含判断,采用普通的方法,时间复杂度为O(n*m),总体复杂度为O(n*n*m). 字符串包含判断,若采

Edit Distance || 计算字符串相似度

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a character c) Repla

计算字符串相似度算法——Levenshtein http://wdhdmx.iteye.com/blog/1343856

0.这个算法实现起来很简单 1.百度百科介绍: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance. 2.用途 模糊查询 3.实现过程 a.首先是有两个字符串,这里写一个简单的 abc和abe b.将字符串想象成下面的结构. A处 是一个标记,为了方便讲解

计算字符串相似度算法——Levenshtein

0.这个算法实现起来很简单 1.百度百科介绍: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance. 2.用途 模糊查询 3.实现过程 a.首先是有两个字符串,这里写一个简单的 abc和abe b.将字符串想象成下面的结构. A处 是一个标记,为了方便讲解

编程之美---旋转字符串

题目:编写一个函数,把一个char组成的字符串循环右移n位.例如:原来是"abcdefghi",如果n = 2,移位后应该是"hiabcdefg". 实现代码: #include<iostream> #include<string> #define max 100 using namespace std; void fun(char a[],int n) { if(a==NULL) return; char temp[max]; int i=

C#和SQL实现的字符串相似度计算代码分享

http://www.jb51.net/article/55941.htm C#实现: 复制代码 代码如下: #region 计算字符串相似度        /// <summary>         /// 计算字符串相似度         /// </summary>         /// <param name="str1">字符串1</param>         /// <param name="str2&qu

字符串相似度计算的方法,使用SQL以及C#实现,本文非原创摘自网络(.NET SQL技术交流群入群206656202需注明博客园)

1 CREATE function get_semblance_By_2words 2 ( 3 @word1 varchar(50), 4 @word2 varchar(50) 5 ) 6 returns nvarchar(4000) 7 as 8 begin 9 declare @re int 10 declare @maxLenth int 11 declare @i int,@l int 12 declare @tb1 table(child varchar(50)) 13 declare

比较2个字符串相似度

我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能.现在提供一个比较两个字符串相似度的方法.通过计算出两个字符串的相似度,就可以通过Linq在内存中对数据进行排序和筛选,选出和目标字符串最相似的一个结果. 本次所用到的相似度计算公式是 相似度=Kq*q/(Kq*q+Kr*r+Ks*s) (Kq > 0 , Kr>=0,Ka>=0)其中,q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,r是字符串