钻石王者B
B
class Solution { private: int next[1000010]; //int next[2]; void getNext(string p) { int len = p.size(); next[0] = 0; int i = 0, j = 0; for (j = 1; j < len; j++) { // i 代表最长前缀后缀长度 while (p[i] != p[j] && i > 0) // 当p[i] != p[j] 时,减小最长前缀后缀长度 i = next[i - 1]; if (p[i] == p[j]) { i++; //最长公共前缀后缀长度+1 next[j] = i; //匹配失败时跳到该处 } else next[j] = 0; } } public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 给定一个字符串s,返回具有相同前缀后缀的子串的第二大长度,反之,返回-1即可。 * @param s string字符串 代表题意中的字符串s * @return int整型 */ int solve(string s) { // write code here getNext(s); int ans = next[s.size() - 1]; if (!ans) ans = -1; return ans; } };