动态规划 空间复杂度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]