この問題を解決するには、通常の列挙は機能しません。その漸近線はO(t*s) になります。したがって、部分文字列検索タスクには、KMP (Knuth-Morris-Pratt) アルゴリズムが使用されます。 このアルゴリズムを実装するには、文字列プレフィックス関数が使用されます。これは長さ n (strong>s) の数値の配列であり、各要素は最大長になります。部分文字列 s の最大の独自の接尾辞を、その接頭辞と一致させます。例:
ベクトル<int> prefix_function (文字列 s) { int n = (int ) s.length(); ベクトル<int>pi(n); の (int i=0; i<n; ++i) の (int k=0; k<=i; ++k) if (s.substr(0,k) == s .substr(i-k+1,k)) pi[i] = k; 円周率を返します。 } プレ>
s
t
1000 ms 256 Mb Rules for program design and list of errors in automatic problem checking