🔴 一字之差:子串 vs 子序列
一个字符串 abcbdcba(8 个字符)。回文就是正着读和倒着读一样。同一个字符串,左边输出最长回文子串的长度,右边输出最长回文子序列的长度: S = "abcbdcba" def longest_pal_subst
自己写:中心扩展
一个字符串 abcbdcba(8 个字符)。回文就是正着读和倒着读一样。c 从 0 数到 2n-2,偶数的 c 落在字符上,奇数的 c 落在缝里。补全往外扩的那两步。
🔴 只试字符位,偶数长度的回文全丢了
拿另一个字符串 abccba 做对照——它整个就是一个回文,而且长度是偶数。把只试字符位的那一版写出来,和正确版一起输出。
⚠️ 两种做法,同一段回文,代价不同
一个字符串 abcbdcba(8 个字符)。回文就是正着读和倒着读一样。暴力枚举所有子串、和中心扩展,两种做法各试了多少次?结果对得上吗?
⚠️ 把「子串」和「子序列」一起交出来
一个字符串 abcbdcba(8 个字符)。回文就是正着读和倒着读一样。两个函数都写好了:一个求最长回文子串(中心扩展),一个求最长回文子序列(区间 DP,就是 l1_algo_10 里写过的那个)。把两个长度一起输出。
一个模式要在很多段文本里反复找,选哪个
模式固定不变,文本一段接一段地来。最划算的是【0】。
⚠️ 一次要找几十个词,选哪个
一段文本,要同时找出几十个关键词出现在哪儿。该用【0】。
⚠️ 模式越长,暴力涨多少
同一段文本(24 个 a),模式分别是 4、6、8 个 a。数一数暴力各比了多少次: T24 = "a" * 24 def brute_cmp(t, p): c = 0 for i in range(l
🔴 同样三种情况,KMP 一动不动
同一段文本、同样是 4、6、8 个 a 的模式,这次数 KMP 的比较次数: T24 = "a" * 24 def brute_cmp(t, p): c = 0 for i in range(len(t
自己写:把选型写成一个函数
三种场景:①一个模式、文本不断来;②几十个词、一段文本;③一个模式、只找一次。按顺序输出各自该用什么。