time limit:
1000ms
memory limit:
10000k
從乙個給定的串中刪去(不一定連續地刪去)0個或0個以上的字元,剩下的字元按原來順序組成的串是該串的子串。例如:「」,「a」,「xb」,「aaa」,「bbb」,「xabb」,「xaaabbb」都是串「xaaabbb」的子串。(例子中的串不包含引號。)
程式設計求n個非空串的最長公共子串的長度。限制:2≤n≤100;n個串中的字元只會是數字0,1,……,9或小寫英文本母a,b,……,z;每個串非空且最多含100個字元:n個串的長度的乘積不會超過30000。
檔案第1行是乙個整數t,表示測試資料的個數(1≤t≤10)。接下來有t組測試資料。各組測試資料的第1行是乙個整數ni,表示第i組資料中串的個數。各組測試資料的第2至n+1行中,每行乙個串,串中不會有空格,但行首和行末可能有空格,這些空格當然不算作串的一部分。
輸出t行,每行乙個數,第i行的數表示第i組測試資料中ni個非空串的最長公共子串的長度。
abbc
cdno hint.
思路:其實這道題應為「最大公共子串行」,一般定義子串是連續的,子串行則允許不連續,於是子串行的演算法比子串麻煩得多。
》由於資料量不是很大,我還是採取了窮舉的思路,至多100個字串,令他們兩兩比對(至多5050對),記下兩兩的最大公共子串長度,而這些長度中最小的那個就是答案。
》關於公共子串的演算法,用到dp,注意陣列最好先加上兩條都是0的邊,實現起來更方便。
假設s1和s2比對,長度分別為l1,l2,先初始化陣列,兩條邊a[0][x]和a[x][0](x = 0, 1, 2,……)全為0,其他位置全為-1;
對1~l1*1~l2的範圍dp,a[i][j]表示s1從1到i的字首與s2從1到j的字首的最長公共子串行的長度;
遞迴:a[i][j] = max;
最大公共子串行,最大公共子串,最大回文子串
1 兩個字串中最長公共子串行 該問題是動態規劃的經典問題,找出的公共序列不一定是連續的,參考資料很多,這裡就貼出公式和 做個簡單的筆記。設序列a,b的長度分別為n和m,l i,j 為a i b j 的最長公共子串行長度,有遞推公式 時間複雜度為o mn 如下 define n 50 intlcs c...
最大公共子串
problem description 從乙個給定的串中刪去 不一定連續地刪去 0個或0個以上的字元,剩下地字元按原來順序組成的串。例如 a xb aaa bbb xabb xaaabbb 都是串 xaaabbb 的子串。例子中的串不包含引號。程式設計求n個非空串的最長公共子串的長度。限制 2 n ...
最大公共子串
最大公共子串 最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並...