Leetcode 3598. Longest Common Prefix Between Adjacent Strings After Removals

1. 解题思路

这一题的话思路上就是一个累计数组的思路。考察任意一个位置 i i i上的答案,事实上就是考察 i − 1 i-1 i1之前所有相邻字符串的最大值与 i + 1 i+1 i+1之后所有相邻元素的最大值,以及 i − 1 i-1 i1 i + 1 i+1 i+1两个字符串的最大值,因此,我们只需要提前算好这些值即可快速求得任意位置上的答案了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def longestCommonPrefix(self, words: List[str]) -> List[int]:
        n = len(words)
        if n == 1:
            return [0]
        if len(set(words)) == 1 and n > 2:
            return [len(words[0]) for _ in range(n)]
        
        def count_prefix(w1, w2):
            if len(w1) > len(w2):
                return count_prefix(w2, w1)
            ans = 0
            for ch1, ch2 in zip(w1, w2):
                if ch1 != ch2:
                    break
                ans += 1
            return ans

        adj = [count_prefix(words[i], words[i+1]) for i in range(n-1)]
        left = [0 for _ in range(n)]
        right = [0 for _ in range(n)]
        for i in range(n-1):
            left[i+1] = max(left[i], adj[i])
            right[n-2-i] = max(right[n-1-i], adj[n-2-i])
        tri = [count_prefix(words[i-1], words[i+1]) for i in range(1, n-1)]
        ans = []
        for i in range(n):
            if i == 0:
                m = right[1]
            elif i == n-1:
                m = left[n-2]
            else:
                m = max(left[i-1], right[i+1])
            ans.append(max(m, tri[i-1]) if 1 <= i < n-1 else m)
        return ans

提交代码评测得到:耗时1000ms,占用内存40.39MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值