【问题标题】:dynamic programming for string comparisons字符串比较的动态规划
【发布时间】:2016-12-02 05:25:38
【问题描述】:

我目前正在研究一个利用 Levenshtein 距离 计算两个字符串之间的最佳分数的问题。

我能够成功计算较小字符串的分数。但是当我尝试使用更长的字符串(超过 5000 个长度)时,我似乎得到了错误的输出。我目前正在考虑这个问题是否与内存分配有关。

下面是我的工作

bool isVowel(char word){
    return word == 'a' || word == 'e' || word == 'i' || word == 'o' || word == 'u';
}

int calculateMismatch(char first, char second){
    int cost;

    if((first != second) && (isVowel(first))){
        cost = 3;
    }else if((first != second) && (isVowel(first) && isVowel(second))){
        cost = 1;
    }else if((first != second) && (isVowel(second))){
        cost = 3;
    }else{
        cost = 1;
    }

       return cost;
}

int getMinimum(int val1 , int val2, int val3){

if((val1 <= val2) && (val1 <= val3)){
    return val1;
}

if((val2 <= val1) && (val2 <= val3)){
    return val2;
}

if((val3 <= val1) && (val3 <= val2)){
    return val3;
}

return 0;

}

int calculatingScore(string str1, string str2){

int sizestr1 = str1.size();
int sizestr2 = str2.size();
int cost;

vector<int> initial(sizestr2 + 1);
vector<vector<int> > result(sizestr1 + 1, initial);

result[0][0] = 0;

for(int i = 1; i < sizestr1 + 1; i++){
    result[i][0] = i * 2;
}

for(int j = 1; j < sizestr2 + 1; j++){
    result[0][j] = j * 2;
}


for(int j = 1; j <= sizestr2 ; j++){
    for(int i = 1; i <= sizestr1 ; i++){
        if(str1[i - 1] == str2[j - 1]){
            cost = 0;
        }else{
            cost = calculateMismatch(str1[i - 1], str2[j - 1]);
        }

        int val1 = result[i - 1][j] + 2;
        int val2 = result[i][j-1] + 2;
        int val3 = result[i-1][j-1] + cost;


        result[i][j] = getMinimum(val1, val2, val3);
    }
}

int finalResult = result[sizestr1][sizestr2];

return finalResult;

}

【问题讨论】:

    标签: c++ dynamic-programming


    【解决方案1】:

    我不知道 Levenshtein 距离,但你的 calculateMismatch 函数似乎是错误的。这应该是

    int calculateMismatch(char first, char second){
        int cost;
    
       if((first != second) && (isVowel(first) && isVowel(second)))
        {
            cost = 3;
        }else if((first != second) && (isVowel(first))){
            cost = 1;
        }else if((first != second) && (isVowel(second))){
            cost = 3;
        }else{
            cost = 1;
        }
    
           return cost;
    }
    

    【讨论】:

    • 为什么知道错了?它有什么问题? en.wikipedia.org/wiki/Levenshtein_distance
    • else if((first != second) && (isVowel(first) && isVowel(second))){ cost = 1; } 此代码无法访问
    • 他们没有错,这些是不匹配的规则
    • 其实你是对的@user1438832,但是你的条件逻辑也给出了错误的输出。
    • 可能将成本初始化为某个值。当第一个等于第二个时,它返回的成本未初始化。
    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-11-09
    相关资源
    最近更新 更多