两个字符串的最小ASCII删除和

*************

C++

topic: 712. 两个字符串的最小ASCII删除和 - 力扣(LeetCode)

*************

Before check the topic, I have retuened my new-buy keyboard yestarday cuz my wrist hurts, so maybe I need a low-profile keyboard.

check the topic:

first I donnot know what is ASCII. I kook for some informations and FYI:

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种字符编码标准,用于表示文本在计算机、通信设备和其它电子设备中的表示形式。ASCII码使用7位二进制数来表示128个不同的字符,包括大小写英文字母、数字0-9以及一些控制字符和标点符号。ASCII码的前32个字符(0-31)是控制字符,用于控制文本的显示和传输,比如换行(LF,ASCII码为10)和回车(CR,ASCII码为13)。剩下的96个字符(32-127)是可打印字符,包括我们常见的字母和数字。

You see, the topic in the other ways says is we have two strings, s1 and s 2, insert or erase the elements in s1, the new one eauals s2, find the least step.

Search the familiar project is my style. U gays guess what, I do find one which is

1143. 最长公共子序列 - 力扣(LeetCode), Longest Common Subsequence, LCS for short. That makes the topic eazy. Here is the spark:

  1. find the LCS of s1 and s2;

  2. Sum the ASCII values of the characters in string s1 that are not part of the LCS.

  3. Sum the ASCII values of the characters in string s2 that are not part of the LCS.

  4. Sum the values.

That is the answer.

Have an eye on how to solve 1143. 最长公共子序列 - 力扣(LeetCode), the soal is as follow

Asshole-eye always superise me. and the code is

cpp 复制代码
class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
       
        // write the follows without hesitation
        int m = text1.size();
        int n = text2.size();
        vector<vector<int>> dp(m + 1, vector(n + 1, 0));

        // main code 
        for (int i = 1; i <= m; i++){
            for (int j = 1; j <= n; j++){
                 if (text1[i-1] == text2[j-1]){ // special attention to the number
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                     dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); // more ez formula
                    }
            }
        }

        return dp[m][n];


    }
};

But in this case, use the soal again,

cpp 复制代码
class Solution {
public:
    
    // sum LCS's ASCII
    int getLCSAsciiSum(string s1, string s2) {
        int m = s1.size();
        int n = s2.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

        // main code 
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1[i - 1] == s2[j - 1]) { // special attention to the number
                    dp[i][j] = dp[i - 1][j - 1] + int(s1[i - 1]);
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); // more ez formula
                }
            }
        }

        return dp[m][n];
    }
    
};

then how to sum the ASCII? easy way to sum:

cpp 复制代码
class Solution {
public:
    
     // sum LCS's ASCII
    int getLCSAsciiSum(string s1, string s2) {
        int m = s1.size();
        int n = s2.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

        // main code 
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1[i - 1] == s2[j - 1]) { // special attention to the number
                    dp[i][j] = dp[i - 1][j - 1] + int(s1[i - 1]);
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); // more ez formula
                }
            }
        }

        return dp[m][n];
    }
    
    // sum ASCII
    int getAsciiSum(string s) {
        int sum = 0;
        for (char c : s) {
            sum += int(c);
        }
        return sum;
    }

    
};

another spark is,

  1. Sum the ASCII values of the characters in string s1 that are not part of the LCS.

  2. Sum the ASCII values of the characters in string s2 that are not part of the LCS.

  3. Sum the values.

use math to caculate is

sum = sums1 + sums2 - 2 * sumLCS

cpp 复制代码
class Solution {
public:
    
     // sum LCS's ASCII
    int getLCSAsciiSum(string s1, string s2) {
        int m = s1.size();
        int n = s2.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

        // main code 
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1[i - 1] == s2[j - 1]) { // special attention to the number
                    dp[i][j] = dp[i - 1][j - 1] + int(s1[i - 1]);
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); // more ez formula
                }
            }
        }

        return dp[m][n];
    }
    
    // sum ASCII
    int getAsciiSum(string s) {
        int sum = 0;
        for (char c : s) {
            sum += int(c);
        }
        return sum;
    }

    // main code
    int minimumDeleteSum(string s1, string s2) {
        int sum1 = getAsciiSum(s1);
        int sum2 = getAsciiSum(s2);
        int sum_LCS = getLCSAsciiSum(s1, s2);
        return sum1 + sum2 - 2 * sum_LCS;
    }
};

Here we go.

相关推荐
hanlin0323 分钟前
刷题笔记:力扣第84题-柱状图中最大的矩形
笔记·算法·leetcode
青少儿编程课堂1 小时前
威佐夫博弈(双堆取子游戏)解析
c++·python·算法·bfs·信息学竞赛
辰烨chenye5 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hqyjzsb9 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye9 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术9 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
sanjiaomao3339 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息10 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
大圣编蚕10 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界11 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法