- UID
- 2
- 精华
- 积分
- 7740
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
编程之美 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]
代码为:
- #include <iostream>
- using namespace std;
- #define min(x,y) ((x<y)?x:y)
- #define arr(x,y) arr[(x)*size2+(y)]
- void main()
- {
- char s1[]="xfdfa";
- char s2[]="xabcdae";
- int size1=sizeof(s1)-1;
- int size2=sizeof(s2)-1;
- int* arr=new int[size1*size2];
- int i,j;
- //初始化角元
- bool matched=false;
- if(*s1 == *s2)
- {
- matched=true;
- arr(0,0)=0;
- }
- else
- {
- arr(0,0)=1;
- }
- //初始化首行
- for(i=1;i<size1;i++)
- {
- arr(i,0)=arr(i-1,0);
- if(!matched && (*s2 == s1[i]))
- {
- matched=true;
- }
- else
- {
- arr(i,0)++;
- }
- }
- //初始化首列
- if(*s1 != *s2)
- {
- matched=false;
- }
- for(i=1;i<size2;i++)
- {
- arr(0,i)=arr(0,i-1);
- if(!matched && (*s1 == s2[i]))
- {
- matched=true;
- }
- else
- {
- arr(0,i)++;
- }
- }
- for(i=1;i<size1;i++)
- {
- for(j=1;j<size2;j++)
- {
- int t1=min(arr(i-1,j),arr(i,j-1));
- int t2=arr(i-1,j-1);
- if(s1[i] == s2[j])
- t2--;
- arr(i,j)=min(t1,t2)+1;
- }
- }
- cout<<arr(size1-1,size2-1)<<endl;
- delete []arr;
- }
复制代码 |
|