Algorithm
lc583_两个字符串的删除操作
思路
感觉是前缀匹配,可以用板子直接套,但是自己有点忘了,想想其他思路
就是板子,看题解回忆一下板子吧
题解发现是公共子序列,还有dp的做法,看来思路还是有偏差的…
链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings/solution/liang-ge-zi-fu-chuan-de-shan-chu-cao-zuo-14uw/
最神奇的是,dp法相当于最长公共子序列的反面法,挺奇妙的
code
最长公共子序列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: int minDistance(string word1, string word2) { int m = word1.size(); int n = word2.size(); vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for (int i = 1; i <= m; i++) { char c1 = word1[i - 1]; for (int j = 1; j <= n; j++) { char c2 = word2[j - 1]; if (c1 == c2) { dp[i][j] = dp[i - 1][j - 1] + 1; } else { dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); } } }
int lcs = dp[m][n]; return m - lcs + n - lcs; } };
|
dp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public: int minDistance(string word1, string word2) { int m = word1.size(); int n = word2.size(); vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for (int i = 1; i <= m; ++i) { dp[i][0] = i; } for (int j = 1; j <= n; ++j) { dp[0][j] = j; } for (int i = 1; i <= m; i++) { char c1 = word1[i - 1]; for (int j = 1; j <= n; j++) { char c2 = word2[j - 1]; if (c1 == c2) { dp[i][j] = dp[i - 1][j - 1]; } else { dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1; } } }
return dp[m][n]; } };
|
Review
对象存储的api接口_ceph文档
Tips
对象存储的api接口_阿里云文档
Share-自己提交代码的几点教训
在工作中,如果要和别人协作提交代码,而且不方便改.gitignore
的情况下,提交代码的时候要十分小心
下面是自己的两次惨痛教训
大工程不要直接git add -A
有时候有许多的修改内容的时候,可能一个个提交比较麻烦,所以git add -A
很方便
但是这个操作容易在忘记git status
检查的时候,把大量的编译文件,或者无关的文件提交到代码仓库
这样会对别人造成很大的不方便,严重的时候会导致一段时间内整个分支无法继续使用
编译出错的修复记得也要提交
有时候工作很多打断的时候,比如老是有人找你的时候,你可能cherry-pick了别人的代码,或者已经commit了代码之后,
编译了很长时间出错了,然后你在本地修改了代码,然后编程成功了,然后你git stash
里面有许多的东西
导致你没有看清你的修改的文件,然后就漏了提交你修复后的修改
这样就会导致提交的代码无法编译通过
提交上去之后,晚上凌晨自动打包的服务器会编译出错,导致打包失败,这样就会导致一个人的错误阻塞了所有的开发测试的工作(因为白天手动打包又得几个小时)