leetcode_1624 两个相同字符之间的最长子字符串

215 阅读1分钟

要求

给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1 。

子字符串 是字符串中的一个连续字符序列。

示例 1:

输入:s = "aa"
输出:0
解释:最优的子字符串是两个 'a' 之间的空子字符串。

示例 2:

输入:s = "abca"
输出:2
解释:最优的子字符串是 "bc" 。

示例 3:

输入:s = "cbzxy"
输出:-1
解释:s 中不存在出现出现两次的字符,所以返回 -1 。

示例 4:

输入:s = "cabbac"
输出:4
解释:最优的子字符串是 "abba" ,其他的非最优解包括 "bb"""

提示:

  • 1 <= s.length <= 300
  • s 只含小写英文字母

核心代码

class Solution:
    def maxLengthBetweenEqualCharacters(self, s: str) -> int:
        ans = -1
        dic = {}
        for i,ch in enumerate(s):
            if ch in dic:
                ans = max(ans,i - dic[ch] - 1)
            else:
                dic[ch] = i
        return ans

image.png

解题思路:(哈希表) O(n) 建立一个哈希表记录每个字符最早出现的位置。遍历数组,如果当前字符不是第一次出现,那么用当前位置减去第一次出现的位置再减 1 来更新答案。时间复杂度:遍历一次数组,故时间复杂度为 O(n)。空间复杂度:仅需要常数的额外空间。