最长快乐前缀
难度:
标签:
题目描述
代码结果
运行时间: 147 ms, 内存: 20.2 MB
/*
* 思路:
* 1. 使用KMP前缀函数的方法,计算最长快乐前缀。
* 2. 使用Java Stream对前缀数组进行处理。
*/
import java.util.stream.IntStream;
public class Solution {
public String longestPrefix(String s) {
int n = s.length();
int[] prefix = new int[n];
IntStream.range(1, n).forEach(i -> {
int j = prefix[i - 1];
while (j > 0 && s.charAt(i) != s.charAt(j)) {
j = prefix[j - 1];
}
if (s.charAt(i) == s.charAt(j)) {
j++;
}
prefix[i] = j;
});
return s.substring(0, prefix[n - 1]);
}
}
解释
方法:
题解采用了KMP算法中的部分思路,构建了一个部分匹配表,用于确定字符串中的最长快乐前缀。算法首先初始化一个长度为s的列表nxt,其中nxt[i]表示字符串s的前i个字符中,最长的相同前缀和后缀的长度。迭代过程中,通过比较当前字符和位置pos指向的字符,如果相同,则更新nxt数组,并将i和pos同时右移。如果不相同,则将pos更新到nxt数组的前一个位置,继续比较,直到找到匹配或遍历完成。最后,nxt数组的最后一个元素即为最长快乐前缀的长度。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在KMP算法中,部分匹配表`nxt`的构建过程中,当字符不匹配时,为什么要将`pos`更新为`nxt[pos - 1]`,这样的更新有什么特别的意义或作用?
▷🦆
在构建`nxt`数组时,初始化`nxt = [0]`的原因是什么?为什么`nxt[0]`的值是0而不是1或其他值?
▷🦆
算法在处理字符串的过程中,如何确保即使在有多个相同的最长前缀和后缀时,也只返回最长的一个?
▷🦆
题解中提到每个字符最多被比较一次,这种处理方式在所有字符串输入情况下都适用吗?例如在极端情况下,比如字符串由相同字符组成,这种说法依然成立吗?
▷