ARST打卡第125周[125/521]

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里面有许多的东西

导致你没有看清你的修改的文件,然后就漏了提交你修复后的修改

这样就会导致提交的代码无法编译通过

提交上去之后,晚上凌晨自动打包的服务器会编译出错,导致打包失败,这样就会导致一个人的错误阻塞了所有的开发测试的工作(因为白天手动打包又得几个小时)