字符串扩展距离问题

问题描述:对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距离为一定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A 和B 的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串A和B的扩展距离。
对于给定的字符串A和B,试设计一个算法,计算其扩展距离。
编程任务:对于给定的字符串A和B,编程计算其扩展距离。
数据输入:由文件input.txt给出输入数据。第1 行是字符串A;第2 行是字符串B。第3行是空格与其它字符的距离定值k。

结果输出:将计算出的字符串A和B的扩展距离输出到文件output.txt。

输入文件示例

input.txt

cmc

snmn 

2

 输出文件示例

output.txt

10


问题解析:解答此题需要一个较为巧妙的解题思路。解决此题可以借用“最长公共子串”问题的解题思路。采用自底向上的动态规划思想。假设对于给定的字符串A,B长度分别为m,n,A[1..m],B[1..n],这里可以使用变量val[m][n]表示A,B的扩展距离。

对于字符串A[1..m],B[1..n],有以下两种情况:

1.A[m]和B[n]处在扩展字符串的同一个位置,那么val[m][n]=val[m-1][n-1]+abs(A[m]-B[n])。

2.A[m]和B[n]不在扩展字符串的同一个位置,则val[m][n]=min{val[m-1][n]+k,val[m][n-1]+k}。

综上,val[m][n]=min{val[m-1][n]+k,val[m][n-1]+k,val[m-1][n-1]+abs(A[m]-B[n])}

由上述递推式,采用自底向上的方法在多项式时间内即可求出val[m][n]


以下是可执行源代码

#include<iostream>
#include<string>
#include<malloc.h>
using namespace std;


int string_extension_distance(string a,string b,int k)
{
int m=a.length();
int n=b.length();
int **val=(int **)malloc(sizeof(int *)*(m+1));
for(int i=0;i<=m;i++)
{
val[i]=(int *)malloc(sizeof(int)*(n+1));
}

val[0][0]=0;
for(int i=1;i<=n;i++)
val[0][i]=i*k;
for(int i=1;i<=m;i++)
val[i][0]=i*k;

int min=1000000;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(val[i-1][j]+k<min)
min=val[i-1][j]+k;
if(val[i][j-1]+k<min)
min=val[i][j-1]+k;
if(val[i-1][j-1]+abs(a[i-1]-b[j-1])<min)
min=val[i-1][j-1]+abs(a[i-1]-b[j-1]);
val[i][j]=min;
min=1000000;
}
}

return val[m][n];
}


int main()
{
string a,b;
int k;
cin>>a>>b>>k;
int sum=string_extension_distance(a,b,k);
cout<<sum<<endl;
}


  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值