LintCode-最長公共字串
阿新 • • 發佈:2019-02-06
79. 最長公共子串
給出兩個字串,找到最長公共子串,並返回其長度。
注意事項
子串的字元應該連續的出現在原字串中,這與子序列有所不同。
給出A=“ABCD”,B=“CBCE”,返回 2
挑戰O(n x m) time and memory.
標籤網上看到的都是dp解法,時間複雜度O(n^2),但我第一次寫了一個多次移位計算相同位置最長字串來解決,發現不僅時間複雜度一樣還省了空間,不過其實過程和dp差不多,但思路比較容易懂。
class Solution {
public:
/**
* @param A: A string
* @param B: A string
* @return: the length of the longest common substring.
*/
int lcs(string a, string b, int x, int y) {
int max = 0, cur = 0;
for (int i = 0; i<a.length() - x; i++) {
if (y + i == b.length()) {
max = max<cur ? cur : max;
return max;
}
if (a[x + i] != b[y + i]) {
max = max<cur ? cur : max ;
cur = 0;
} else {
cur++;
}
}
max = max<cur ? cur : max;
return max;
}
int longestCommonSubstring(string &A, string &B)
{
// write your code here
string a(A), b(B);
int max = 0;
for (int i = 0; i<a.length(); i++) {
int cur = lcs(a, b, i, 0);
max = max<cur ? cur : max;
}
for (int i = 0; i<b.length(); i++) {
int cur = lcs(a, b, 0, i);
max = max<cur ? cur : max;
}
return max;
}
};