NC35 最小编辑代价

题目描述:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000

解题分析;

dp[i][j]的含义为:word1的前i个字符和word2的前j个字符的编辑距离。意思就是word1的前i个字符,变成word2的前j个字符,最少需要这么多步。

class Solution {
    
    
public:
    /**
     * min edit cost
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @param ic int整型 insert cost
     * @param dc int整型 delete cost
     * @param rc int整型 replace cost
     * @return int整型
     */
    int minEditCost(string str1, string str2, int ic, int dc, int rc) {
    
    
        // write code here
        int str1Size=str1.size();
        int str2Size=str2.size();
        vector<vector<int>> dp(str1Size+1, vector<int>(str2Size+1));
        for(int i=1; i<=str1Size; ++i){
    
    
            dp[i][0]=dc*i;
        }
        for(int j=1; j<=str2Size; ++j){
    
    
            dp[0][j]=ic*j;
        }
        
        for(int i=1; i<=str1Size; ++i){
    
    
            for(int j=1; j<=str2Size; ++j){
    
    
                if(str1[i-1]==str2[j-1])
                    dp[i][j]=dp[i-1][j-1];
                else
                    dp[i][j]=min(dp[i-1][j-1]+rc, min(dp[i-1][j]+dc, dp[i][j-1]+ic));
            }
        }
        return dp[str1Size][str2Size];
    }
};

Guess you like

Origin blog.csdn.net/MaopengLee/article/details/118944903