题目地址:
https://leetcode.com/problems/longest-happy-prefix/
给定一个字符串,其长度为 k k k的前缀和长度为 k k k后缀有可能相等,问最大的 k k k对应的那个前缀是什么。
题目本质上是求KMP算法中的next数组(KMP有个原始版本和优化版本,这里指的是原始版本。对于原始版本, n [ i ] n[i] n[i]表示 s [ 1 : i ] s[1:i] s[1:i]中最长相等前后缀的长度,规定 n [ 1 ] = 0 n[1]=0 n[1]=0,字符串下标从 1 1 1开始)。参考https://blog.csdn.net/qq_46105170/article/details/113805346。代码如下:
class Solution {
public:
string longestPrefix(string s) {
int n = s.size();
s = " " + s;
int ne[n + 1];
ne[1] = 0;
for (int i = 2, j = 0; i <= n; i++) {
while (j && s[i] != s[j + 1]) j = ne[j];
if (s[i] == s[j + 1]) j++;
ne[i] = j;
}
return s.substr(1, ne[n]);
}
};
时空复杂度 O ( n ) O(n) O(n)。