如何不重不漏地枚举一个字符串的所有本质不同子序列
考场上竟然不会,太菜了/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。