为了方便自己理解,我决定写一下它们的区别
最长公共子串
:首先关于它的理解就是,既然是子串,那它肯定是连续的
拿一个例子来说话
h | i | s | h | |
---|---|---|---|---|
f | 0 | 0 | 0 | 0 |
i | 0 | 1 | 0 | 0 |
s | 0 | 0 | 2 | 0 |
h | 1 | 0 | 0 | 3 |
看这两个fish和hish,它们的原理就是对比是否相同,如果相同就在前一个的基础上+1
比如那个123就是折磨来的,而第五行的那个1,是因为他和另一个hish的第一个进行比较,不管怎么样,最多只能有一个代码相同,用代码来表示的原理就是
if(word_a[i]==word_b[i])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=0;
最长公共子序列
:它可以是不连续的
还是一个例子用来理解
f | o | s | h | |
---|---|---|---|---|
f | 1 | 1 | 1 | 1 |
i | 1 | 1 | 1 | 1 |
s | 1 | 1 | 2 | 2 |
h | 1 | 1 | 2 | 3 |
关于他的理解就是如果它们不相等,看他的前一个和上一行的那个数谁大,就选谁,否则+1
看代码原理
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j];