LintCode-最長公共字串

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章