Leetcode 1392:最長快樂前綴(超詳細的解法!!!)

「快樂前綴」是在原字符串中既是 非空 前綴也是後綴(不包括原字符串自身)的字符串。

給你一個字符串 s,請你返回它的 最長快樂前綴

如果不存在滿足題意的前綴,則返回一個空字符串。

示例 1:

輸入:s = "level"
輸出:"l"
解釋:不包括 s 自己,一共有 4 個前綴("l", "le", "lev", "leve")和 4 個後綴("l", "el", "vel", "evel")。最長的既是前綴也是後綴的字符串是 "l" 。

示例 2:

輸入:s = "ababab"
輸出:"abab"
解釋:"abab" 是最長的既是前綴也是後綴的字符串。題目允許前後綴在原字符串中重疊。

示例 3:

輸入:s = "leetcodeleet"
輸出:"leet"

示例 4:

輸入:s = "a"
輸出:""

提示:

  • 1 <= s.length <= 10^5
  • s 只含有小寫英文字母

解題思路

首先不難寫出暴力解法。

class Solution:
    def longestPrefix(self, s: str) -> str:
        n = len(s)
        for i in range(n - 1, 0, -1):
            if s[:i] == s[-i:]:
                return s[:i]
        return ""

實際上最大前綴和後綴的匹配就是KMP算法next數組的定義,直接套模板就行了。

class Solution:
    def longestPrefix(self, s: str) -> str:
        n = len(s)
        f = [0] * (n + 1)
        f[0], i, j = -1, 0, -1
        
        while i < n:
            while j != -1 and s[i] != s[j]:
                j = f[j]
            i += 1
            j += 1
            f[i] = j
        return s[:f[-1]]

我將該問題的其他語言版本添加到了我的GitHub Leetcode

如有問題,希望大家指出!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章