这里只说步骤吧,至于原理,可以自己百度找找;
假设两个序列 A,B,找两者的最长公共子序列;
第一步: 我们要去找出 A中所有与 B 相同的元素,这些元素在 B中的位置,各自为一个集合;比如 A = { a c f d } ,B = { c f g c a } , 则有 (从 i = 1 开始 )a ={ 5 } , c = { 1 ,4 } , f = { 2 }; a 这个元素对应B的第 5 个位置,c 对应B 第1 个和第 4 个位置,以此类推;
第二步: 如果元素对应B位置的集合的数字有多个,要给集合从高到低排好序,比如 c = { 4 ,1 } (排完序后)
第三步: 用这些元素的集合,替换序列 A , A 中 a这个元素换成 (5),c这个元素换成 (4,1),f这个元素换成(2),d没有对应的集合,去掉,最后得出的序列是 A = 5 4 1 2 ;
第四步: 求A = 5412 的最长上升子序列的长度,如果这里的求最长上升子序列长度的算法仍然用 复杂度为(n*n)的话,那这个求最长公共子序列长度的方法就没意义了,这里用求最长上升子序列长度(nlogn) 的方法求解,得出的长度就是最长公共子序列的长度;
上面就是全部的求解步骤;
这里也顺便把 nlogn的求最长上升子序列长度的方法说一下;
除了放要求解的序列的数组外,还需要准备另一个数组去放一条递增的序列,并时刻记录长度;
我们假设有一个数组 a ={ 1 3 4 2 7 6 8 } ,求这个数组的最长上升子序列的长度 ,另外有一个 b[ ] 的空数组,一个记录 b数组长度的变量 p = 0; 先放a 中的第一个元素 1 到b数组里面, 然后从 i = 1 开始(数组从 0 开始遍历