1392. Longest Happy Prefix

https://leetcode.com/problems/longest-happy-prefix/

A string is called a happy prefix if is a non-empty prefix which is also a suffix (excluding itself).

Given a string s. Return the longest happy prefix of s .

Return an empty string if no such prefix exists.

Example 1:

Input: s = "level"
Output: "l"
Explanation: s contains 4 prefix excluding itself ("l", "le", "lev", "leve"), and suffix ("l", "el", "vel", "evel"). The largest prefix which is also suffix is given by "l".

Example 2:

Input: s = "ababab"
Output: "abab"
Explanation: "abab" is the largest prefix which is also suffix. They can overlap in the original string.

Example 3:

Input: s = "leetcodeleet"
Output: "leet"

Example 4:

Input: s = "a"
Output: ""

Constraints:

  • 1 <= s.length <= 10^5

  • s contains only lowercase English letters.

对给定str找最长匹配的前后缀,前后缀之间可以有重叠。前后缀匹配=> KMP。KMP本质可看作是dp,dp[i]存以pattern字符串A中以i为底可匹配的最长前后缀长度。ptr初始为dp[i -1],当A[i]和dp[ptr]不等时,ptr = dp[ptr],直到相等或ptr == 0。比如aacaad的dp = [0,1,0,1,2,0],匹配d时先检查d和c是否相等,对应aac和aad;不等时往前跳到下一个与A[i-1]匹配的位置,匹配a和d,对应aa和ad。过程如下,方块为未知i,△为prefix中下一个和A[i]匹配的字符:

除此之外还可以用rolling hash做,只用O(1)空间,参加lee215的答案

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

Last updated