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;
}
};
全部评论
(1) 回帖