250926 thinking 子序列判断
1. 介绍
引例:
有一个字符串t。现有若干字符集合$s_i$,需要判断对于每一个$s_i$,它的每一个元素是否在t中出现。
一种方式是,对于t中的所有字符建立一个map。然后对于一个$s_i$中的每一个元素c,若map[c]都判断为存在,则$s_i$的每一个元素都在t中出现,否则不是。
现在将问题换为“有一个字符串t。现有一个字符串集合$s$,需要判断对于每一个元素$e_i$,它是否是t的子序列。”
这个时候,不仅仅要考虑字符的存在与否了,还要考虑字符之间的相对位置关系。
比方说,t=aaabbb,e=ba。判断e是否是t的子序列时,我们还要判断在t的b后面的元素中是否还有a。
我们使用的map得能够“屏蔽”在t的某个元素前面的所有元素的存在性。
于是使用nxt,nxt[i][c]: t中下标不小于i的元素中出现c的最小下标。
2. 解释
将nxt[t.length][c]初始化一个很大的值BIG,作为判断存在依据。
其他nxt[i][c]构建:
1 | for i in t.length-1 to 0; do |
对于一个字符串$e_i$判断:
1 | idx := 0 |
3. 例题
给出go的解法示例
1 | func numMatchingSubseq(s string, words []string) int { |
https://eliano64.github.io/2025/09/26/250926-thinking-%E5%AD%90%E5%BA%8F%E5%88%97%E5%88%A4%E6%96%AD/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!