• 712. Minimum ASCII Delete Sum for Two Strings


    动态规划 
    空间复杂度O(mn)
    第一次提交
    class Solution {
    public:
        int minimumDeleteSum(string s1, string s2) {
            //cout<<"s1: "<<s1<<endl;
            //cout<<"s2: "<<s2<<endl;
            int m=s1.size();
            int n=s2.size();
            vector<vector<int>> dp(m+1,vector<int>(n+1,0));
            for(int i=0;i<m;i++){
                dp[i+1][0]=dp[i][0]+s1[i];
                for(int j=0;j<n;j++){
                    dp[0][j+1]=dp[0][j]+s2[j];
                    if(s1[i]==s2[j])
                        dp[i+1][j+1]=dp[i][j];
                    else
                        dp[i+1][j+1]=min(dp[i][j+1]+s1[i],dp[i+1][j]+s2[j]);
                }
            }
            /*
            for(int i=0;i<m+1;++i){
                for(int j=0;j<n+1;++j){
                    cout<<dp[i][j]<<" ";
                }
                cout<<endl;
            }
            */
            return dp[m][n];
        }
    };
    

     动态规划 空间复杂度 min(O(m),O(n))

     1 class Solution {
     2 public:
     3     int minimumDeleteSum(string s1, string s2) {
     4         //cout<<"s1: "<<s1<<endl;
     5         //cout<<"s2: "<<s2<<endl;
     6         //int m=s1.size();
     7         int m=s1.size();
     8         int n=s2.size();
     9         vector<int> dp(n+1,0);
    10         for(int j=0;j<n;++j)
    11             dp[j+1]=dp[j]+s2[j];
    12         for(int i=0;i<m;++i){
    13             int t1=dp[0];
    14             dp[0]=dp[0]+s1[i];
    15             for(int j=0;j<n;++j){
    16                 int t2=dp[j+1];
    17                 if(s1[i]==s2[j])
    18                     dp[j+1]=t1;
    19                 else
    20                     dp[j+1]=min(dp[j+1]+s1[i],dp[j]+s2[j]);
    21                 t1=t2;
    22             }
    23         }
    24         return dp[n];
    25     }
    26 };

    python 代码

    class Solution(object):
        def minimumDeleteSum(self, s1, s2):
            """
            :type s1: str
            :type s2: str
            :rtype: int
            """
            m=len(s1)
            n=len(s2)
            dp=[[0 for _ in xrange(len(s2)+1)] for _ in xrange(len(s1)+1)]
            for j in xrange(1,len(s2)+1):
                dp[0][j]=dp[0][j-1]+ord(s2[j-1])
            for i in xrange(1,len(s1)+1):
                dp[i][0]=dp[i-1][0]+ord(s1[i-1])
                #print "dp[{}][0]: {}".format(i,dp[i][0])
                for j in xrange(1,len(s2)+1):
                    if s1[i-1]==s2[j-1]:
                        dp[i][j]=dp[i-1][j-1]
                    else:
                        dp[i][j]=min(dp[i-1][j]+ord(s1[i-1]),dp[i][j-1]+ord(s2[j-1]))
                        
                        
            #print dp
            
            return dp[-1][-1]
  • 相关阅读:
    按学生成绩排序
    错误分析:floating point formats not linked
    学生成绩等级统计
    两个链表按升序合并
    js随机生成hex色值
    WEB监控系列第一篇:web监控搭建——graphite+statsd(单机搭建)
    WEB监控系列第四篇:statsd指南
    WEB监控系列第三篇:graphite指南
    安装Fedora 15后需做的25件事情
    《python tutorial》python 学习第二天
  • 原文地址:https://www.cnblogs.com/learning-c/p/9266082.html
Copyright © 2020-2023  润新知