【动态规划】 字符串编辑

583. 两个字符串的删除操作

class Solution {
public:
    int minDistance(string word1, string word2) {
        int len1 = word1.size();
        int len2 = word2.size();
        int dp[len1 + 1][len2 + 1];
        for(int i=0;i<=len1;++i)
            dp[i][0] = i;
        for(int j=1;j<=len2;++j)
            dp[0][j] = j;
        for(int i=0;i<len1;++i){
            for(int j=0;j<len2;++j){
                if(word1[i] == word2[j])
                    dp[i+1][j+1] = dp[i][j];
                else
                    dp[i+1][j+1] =min( min(dp[i][j+1], dp[i+1][j]) + 1, dp[i][j] + 2);
                // cout << i+1 << " " << j+1 << " " << dp[i+1][j+1] << endl;
            }
        }
        return dp[len1][len2];
    }
};

72. 编辑距离

class Solution {
public:
    int minDistance(string word1, string word2) {
        int len1 = word1.size();
        int len2 = word2.size();
        int dp[len1+1][len2+1];
        for(int i=0;i<=len1;++i)
            dp[i][0] = i;
        for(int j=1;j<=len2;++j)
            dp[0][j] = j;
        for(int i=1;i<=len1;++i){
            for(int j=1;j<=len2;++j){
                if(word1[i-1] == word2[j-1])
                    dp[i][j] = dp[i-1][j-1];
                else
                    dp[i][j] = min(dp[i-1][j], min(dp[i][j-1], dp[i-1][j-1])) + 1;
            }
        }
        return dp[len1][len2];
    }
};

650. 只有两个键的键盘

class Solution {
public:
    int minSteps(int n) {
        int dp[n+1];
        dp[1] = 0;
        for(int i=2;i<=n;++i){
            dp[i] = i;
            for(int j=1;j<i;++j){
                if(i % j == 0)
                    dp[i] = min(dp[i], dp[j] + i/j);
        }
        return dp[n];
    }
};
posted @ 2022-03-02 22:48  fwx  阅读(31)  评论(0)    收藏  举报