C++ 字符串比较的动态规划
我目前正在解决一个问题,即利用Levenshtein距离计算两个字符串之间的最佳分数 我能够成功地计算较小字符串的分数。但是当我尝试使用更长的字符串(长度超过5000)时,我似乎得到了错误的输出。我现在在想这个问题是否与内存分配有关 下面是我的作品C++ 字符串比较的动态规划,c++,dynamic-programming,C++,Dynamic Programming,我目前正在解决一个问题,即利用Levenshtein距离计算两个字符串之间的最佳分数 我能够成功地计算较小字符串的分数。但是当我尝试使用更长的字符串(长度超过5000)时,我似乎得到了错误的输出。我现在在想这个问题是否与内存分配有关 下面是我的作品 bool isVowel(char word){ return word == 'a' || word == 'e' || word == 'i' || word == 'o' || word == 'u'; } int calculate
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;
}
bool是元音(char单词){
返回单词=='a'| |单词=='e'| |单词=='i'| |单词=='o'| |单词=='u';
}
int匹配(字符第一,字符第二){
国际成本;
如果((第一个!=第二个)&&(第一个是元音){
成本=3;
}else if((第一个!=第二个)&&(第一个是元音,第二个是元音){
成本=1;
}else如果((第一个!=第二个)&&(第一个元音(第二个))){
成本=3;
}否则{
成本=1;
}
退货成本;
}
int getMinimum(int val1、int val2、int val3){
如果((val1我不知道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;
}
为什么你知道它错了?它错了什么?否则如果((第一!=第二)和(&&(第一)和(&&Is元音(第二)){cost=1;}此代码无法访问它们没有错这些是不匹配的规则实际上您是对的@user1438832,但您的条件逻辑也给出了错误的输出。可能是初始化成本为某个值。当第一个值等于第二个值时,返回的是未初始化的成本。