#include using namespace std; /* aabaaab 答案: [0,1,0,1,2,2,3] */ //朴素版本求字符串的前缀函数 vector prefix_function1(string s) { int n = (int)s.length(); vector pi(n); for (int i = 1; i < n; i++) for (int j = i; j >= 0; j--) if (s.substr(0, j) == s.substr(i - j + 1, j)) { pi[i] = j; break; } return pi; } // 第一轮优化后的版本 vector prefix_function2(string s) { int n = (int)s.length(); vector pi(n); for (int i = 1; i < n; i++) for (int j = pi[i - 1] + 1; j >= 0; j--) // improved: j=i => j=pi[i-1]+1 if (s.substr(0, j) == s.substr(i - j + 1, j)) { pi[i] = j; break; } return pi; } // 第二轮优化后的版本 vector prefix_function3(string s) { int n = (int)s.length(); vector pi(n); for (int i = 1; i < n; i++) { int j = pi[i - 1]; while (j > 0 && s[i] != s[j]) j = pi[j - 1]; if (s[i] == s[j]) j++; pi[i] = j; } return pi; } int main() { string s = "aabaaab"; vector res = prefix_function1(s); for (int i = 0; i < (int)res.size(); i++) cout << res[i] << " "; puts(""); res = prefix_function2(s); for (int i = 0; i < (int)res.size(); i++) cout << res[i] << " "; puts(""); res = prefix_function3(s); for (int i = 0; i < (int)res.size(); i++) cout << res[i] << " "; puts(""); return 0; }