要解决这个问题,通常的枚举是行不通的,因为它的渐近线是 O(t*s)。因此,对于子串搜索任务,采用了KMP(Knuth-Morris-Pratt)算法。 为了实现这个算法,使用了字符串前缀函数,这是一个长度为n (strong>s)的数字数组,其中每个元素都是 最大长度子字符串 s 的最大自身后缀,匹配其前缀。例如:
矢量<int> prefix_function(字符串 s){ int n = (int ) s.长度(); 矢量<int>pi(n); 对于 (int i=0; i<n; ++i) 对于 (int k=0; k<=i; ++k) 如果 (s.substr(0,k) == s .substr(i-k+1,k)) pi[i] = k; 返回pi; }
s
t
1000 ms 256 Mb Rules for program design and list of errors in automatic problem checking