字符串比较问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

字符串比较问题

一、问题描述

对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距离为一定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,试设计一个算法,计算其扩展距离。

二、算法设计

解答:

设字符串A和B的字串A[1...i]和B[1...j]的扩展距离是val(i, j);

依题意,字符串A和B有三种可能的情况:

1)A串最后一个字符是空格,B串最后一个字符是字母,则val(i, j) = val(i-1, j) + k;

2)A串最后一个字符时字母,B串最后一个字符时空格,则val(i, j) = val(i, j-1) + k;

3)A串和B串最后一个字符均是字母,则val(i, j) = val(i-1, j-1) + dist(a i, b i);

由上可知,val(i, j)具有最优子结构性质,且满足如下递推式:

val(i, j) = min{ val(i-1, j) + k,val(i, j) + k,val(i-1, j-1) + dist(a i, b i) }

(使用动态规划算法,自底向上的计算各个子问题并利用每次计算的结果,避免重复运算,从而降低算法复杂度。)

从动态规划递归式可知,算法的时间复杂度为O(mn),m和n分别是字符串A和B的长度。

代码如下:

#include

#include

#define MAX 100000//标识最大的可能整数

int val[300][300];

std::string stra;//字符串A

std::string strb;//字符串B

int k;//定值k

//返回字符a与b的ASCII码的差的绝对值

int dist(char a,char b)

{

return abs(a-b);

}

int comp()

{

int len1, len2;

int tmp;

val[0][0] = 0;

len1 =stra.length();

len2 = strb.length();

for(int i=0; i<=len1; i++)//字符串A和B 的有效下标是º1~len,下标0表示空字符串

{

//i或j是0表示A或B串为空串

for(int j=0; j<=len2; j++)

{

if(i+j)//i和j至少一个大于0

{

val[i][j] = MAX;

tmp = val[i-1][j] + k;

if(i &&

(tmp

val[i][j] = tmp;

tmp = val[i][j-1]+k;

if(j &&

(tmp

val[i][j] = tmp;

tmp = val[i-1][j-1] + dist(stra[i], strb[j]);

if((i*j) &&

(tmp

val[i][j] = tmp;

}

}

}

return val[len1][len2];

}

int main()

{

std::cin>>stra>>strb>>k;

stra =" "+ stra;//此处在字符串开头添加一个空格,是为了使字符串stra

strb =" "+ strb;//的控制台输入的有效字符下标从1到stra.length()

std::cout<

system("pause");

return0;

}

相关文档
最新文档