給兩個 DNA 字串(僅含 a, t, c, g),求最長公共子串,若有多個相同長度則按字典序輸出。字串長度 ≤ 300。
解法:後綴數組 + 高度數組
將兩字串用特殊字符連接:S = s1 + '$' + s2。
構建後綴數組 SA 和高度數組 Height。
遍歷 Height,找屬於不同原字串的相鄰後綴,記錄最大長度 L。
再次遍歷收集所有長度為 L 且來自不同字串的子串,去重並排序輸出。
關鍵代碼片段 (C++)
void build_sa(int s[], int n, int m) { ... } // 倍增法構建 SA
void getHeight(int s[], int n) { ... } // 計算 Height
bool judge(int n, int len) { ... } // 判斷是否存在長度為 len 的公共子串
// 主程序二分長度,收集結果