題目地址:
https://leetcode.com/problems/longest-happy-prefix/
給定一個字符串,其長度爲的前綴和長度爲後綴有可能相等,問最大的對應的那個前綴是什麼。
題目本質上是求KMP算法中的next數組(KMP有個原始版本和優化版本,這裏指的是原始版本。對於原始版本,表示中最長相等前後綴的長度,規定)。
我們考慮和的遞推關係。
首先,我們是可以確定的。對於,假設,意味着:
1、若,那麼就有,所以。但如果的話,就會導致,從而有,這與矛盾了,所以有。
2、若,根據next數組的定義,要繼續和進行比較,如果不等,則繼續和進行比較,如此這樣下去,直到與相等爲止,相等後,;若一直都不等,則,也是對的。證明與1類似。代碼如下:
public class Solution {
public String longestPrefix(String s) {
if (s == null || s.isEmpty()) {
return "";
}
// 因爲要求的是s的最長相等前後綴的長度,所以要多開一個長度
int[] next = new int[s.length() + 1];
next[0] = -1;
int i = 0, j = -1;
while (i < s.length()) {
while (j != -1 && s.charAt(i) != s.charAt(j)) {
j = next[j];
}
i++;
j++;
next[i] = j;
}
return s.substring(0, next[s.length()]);
}
}
時空複雜度。