题目链接:http://poj.org/problem?id=1934
先用动态规划求两个字符串的最长公共子序列的保存在dp[i][j];dp[i][j]表示s1字符串1到i和s2字符串1到j的最长公共子序列的长度
然后用两个变量last1[i][j],last2[i][j]来分别保存字符j(a的序号为0,b的序号为1,…..z的序号为25)在字符串1-i中出现的最大标号,要是字符j没有出现,则last[i][j]= 0;
然后从两个字符串的长度len1和len2开始枚举a—z字符,比如开始 t1 = last1[len1][0], t2 = last2[len2][0]表示a在s1字符串1—len1的最大下标为t1, 在s2字符串1–len2的最大下标为t2,那么若dp[t1][t2] 的值为s1和s2的最大公共子序列长度cnt则表示这个字符符合,保存起来,否则枚举下一个字符b。若满足情况的话,在继续在t1-1 和 t2 - 1 符合最大公共子序列为cnt - 1的字符串保存,如此循环,知道到达最长公共子序列为0时结束。把保存的字符串放入set集合里面,让它按字典序排序。
引用自https://blog.csdn.net/xiaoxiaoluo/article/details/8169533
动态规划具有重叠子问题的特性,dp数组只保留了相当有限的信息。为了求出所有满足条件的子序列,必须另开一个数组维护信息。
另外实现上有一个小细节出错了,就是s[i]
下标从0开始,dp[i][j]
下标从1开始,一开始混在一起了。
1 |
|