《Longest Subsequence》题目分析
一般我们判断字符串Wi是不是字符串S的子序列,复杂度是O(|S|)
的:
我们从左向右从S
里找到一个字符Wi[0]
,再向右找第一个Wi[1]
,再向右找第一个Wi[2]
...,直到找到Wi
最后一个字符或者S
结束也没有找完Wi
。
不过如果我们能先计算出来f[i][c]
表示S[i]
之后,第一个字符c
的位置,那么上面的计算过程可以优化到O(|Wi|)
:
因为一旦我们找到S[i]是第一个Wi[0]
之后,再向右的第一个Wi[1]
的位置就是f[i][Wi[1]]
,再向右第一个Wi[2]
的位置就是f[ f[i][Wi[1]] ][Wi[2]]
...
而f数组的计算可以通过从后向前扫描S,O(26 * |S|)
计算出来。
有了f之后,再依次计算Wi是不是S的子序列,总复杂度是O( Σ|Wi| )
的。