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
最长公共子序列
| 12
 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
| 12
 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里面有许多的东西
导致你没有看清你的修改的文件,然后就漏了提交你修复后的修改
这样就会导致提交的代码无法编译通过
提交上去之后,晚上凌晨自动打包的服务器会编译出错,导致打包失败,这样就会导致一个人的错误阻塞了所有的开发测试的工作(因为白天手动打包又得几个小时)