字符串比较问题 
一、问题描述 
对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离为一定值k。 在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干 空格字符所产生的字符串。在字符串A 和B 的所有长度相同的扩展中,有一对距离最小的 扩展,该距离称为字符串A和B的扩展距离。 对于给定的字符串A和B,试设计一个算法,计算其扩展距离。 
二、算法设计 
解答:
设字符串A和B的字串i]和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(ai , bi);
由上可知,val(i, j)具有最优子结构性质,且满足如下递推式:
val(i, j) = min{ val(i-1, j) + k,val(i, j) + k,val(i-1, j-1) + dist(ai , bi) }
(使用动态规划算法,自底向上的计算各个子问题并利用每次计算的结果,避免重复运算,从而降低算法复杂度。)
从动态规划递归式可知,算法的时间复杂度为O(mn),m和n分别是字符串A和B的长度。
 
代码如下:
#include <iostream>
#include <cmath>
 
#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]))//i大于0
                                               val[i][j] = tmp;
                                             
                                     tmp = val[i][j-1]+k;
                                     if(j && (tmp<val[i][j]))//j大于0
                                               val[i][j] = tmp;
                                             
                                     tmp = val[i-1][j-1] + dist(stra[i], strb[j]);
                                     if((i*j) && (tmp<val[i][j])) //i和j至少有一个不为0
                                               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<<comp()<<std::endl;
         system("pause");
         return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。