• 动态规划-字符串编辑距离


    https://blog.csdn.net/C20190413/article/details/75030105

    #include<iostream>
    #include <stdio.h> 
    #include <stack> 
    #include <string> 
    #include <vector>
    #include <math.h>
    #include <limits.h> 
    using namespace std;
    
    class Solution {
    public:
        /**
         * 计算最少的距离
         * @param S1 string字符串 第一个字符串
         * @param S2 string字符串 第二个字符串
         * @return int整型
         */
        
        int min_fuc(int x,int y,int z) //algorithm库的min只有两个参数(即只能对两个数进行判定),所以我自己写了一个min函数
        {
            if(x<=y&&x<=z) return x;
            else if(y<=x&&y<=z) return y;
            else return z;
        }
        
        int GetMinDistance(const string& S1, const string& S2) {
            // write code here
            int dp[S1.length()+1][S2.length()+1];
            for (int i = 0; i<= S1.length(); i++)
                for (int j = 0; j<= S2.length(); j++) {
                    if (i == 0) {
                        dp[i][j] = j;
                        continue;
                    }
                    if (j == 0) {
                        dp[i][j] = i;
                        continue;
                    }
                    if (S1[i-1] == S2[j-1]) {
                        dp[i][j] = dp[i-1][j-1];
                    }
                    else {
                        dp[i][j] = 1 + min_fuc(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
                    }
                }
            
            /*int num = 0;
            for (int i=0; i< S1.length()+1; i++)
                for (int j=0; j< S2.length()+1; j++) {
                    cout << dp[i][j] << " ";
                    num ++;
                    if (num == S2.length()+1) {
                        cout << endl;
                        num = 0;
                    }
                }
            */
            return dp[S1.length()][S2.length()];
    
        }
    };
    
    
    int main()
    {
        const string str1 = "aaa";
        const string str2 = "bbb";
    
        Solution sl;
        int dis = sl.GetMinDistance(str1, str2);
        cout << dis << endl;
        
        return 0;
    }

    ======牛客另外一题===============

    给定两个长度相等的,由小写字母组成的字符串S1和S2,定义S1和S2的距离为两个字符串有多少个位置上的字母不相等。
    现在牛牛可以选定两个字母X1和X2,将S1中的所有字母X1均替换成X2。(X1和X2可以相同)
    牛牛希望知道执行一次替换之后,两个字符串的距离最少为多少
    链接:https://www.nowcoder.com/questionTerminal/82bd533cd9c34df29ba15bbf1591bedf?answerType=1&f=discussion
    来源:牛客网
    
    正解:
    对于所有可能的X1, X2, 记录cnt[X1][X2]有多少个位置i, 使得S1[i] == X1, S2[i] == X2
    这一步只需扫描一遍字符串即可计算得到
    然后枚举可能的X1, X2,这时距离 = 原本的距离 + cnt[X1][X1] - cnt[X1][X2]
    时间复杂度O(N)
    
     /**
     * 计算最少的距离
     * @param S1 string字符串 第一个字符串
     * @param S2 string字符串 第二个字符串
     * @return int整型
     */
    int GetMinDistance(string S1, string S2) {
        int cnt[26][26];
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < 26; j++) {
                cnt[i][j] = 0;
            }
        }
        int n = S1.size();
        int sum = 0;
        for (int i = 0; i < n; i++) {
            int a = S1[i] - 'a', b = S2[i] - 'a';
            cnt[a][b]++;
            sum += (a != b);
        }
        int ans = sum;
        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < 26; j++) {
                ans = min(ans, sum + cnt[i][i] - cnt[i][j]);
            }
        }
        return ans;
    }
  • 相关阅读:
    上手 WebRTC DTLS 遇到很多 BUG?浅谈 DTLS Fragment
    亮相 LiveVideoStackCon,透析阿里云窄带高清的现在与未来
    会议更流畅,表情更生动!视频生成编码 VS 国际最新 VVC 标准
    如何用 Electron + WebRTC 开发一个跨平台的视频会议应用
    理论 + 标准 + 工程 —— 阿里云视频云编码优化的思考与发现
    遍历哈希表
    sql语句的循环执行
    一个aspx页面里所有的控件
    SELECT DISTINCT 语句
    100 The 3n + 1 problem
  • 原文地址:https://www.cnblogs.com/TMatrix52/p/12594718.html
Copyright © 2020-2023  润新知