如何不重不漏地枚举一个字符串的所有本质不同子序列

考场上竟然不会,太菜了/kk

给定字符串 \(S\),需要实现不重不漏地枚举一个字符串的所有本质不同子序列,其中两个子序列本质不同当且仅当它们所代表的的字符串不同(即不关注下标)。

考虑如何判断一个串 \(T\) 能否成为 \(S\) 的子序列,我们肯定是从前往后一位一位地用 \(S\) 匹配 \(T\),能匹配就匹配,看最后能不能匹配完 \(T\)

于是对于每一个位置 \(i\)\(0\leq i\leq n\)),枚举字符 \(c\),然后向 \(i\) 后面第一次出现字符 \(c\) 的位置 \(j\) 连一条边 \(i\to j\)(显然建出来的图是一个 DAG)。那么从位置 \(0\) 出发的所有路径都是 \(S\) 的一个子序列,而且不同路径一定对应着不同的子序列。

需要根据字典序枚举子序列就可以直接在图上 dfs,需要根据长度枚举子序列就可以直接在图上 bfs。

posted @ 2022-10-31 08:40  ez_lcw  阅读(61)  评论(0编辑  收藏  举报