leetcode笔记之[1624. 两个相同字符之间的最长子字符串]

343 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

1624. 两个相同字符之间的最长子字符串 - 力扣(LeetCode)

给你一个字符串 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 只含小写英文字母

二、思路分析:

  1. 先将传入的字符串转换成不重复的集合,减少重复遍历次数
  2. 然后遍历集合,在传入的字符串中统计每个字符的数量,如果字符数量大于1,则添加到空列表中,最后只需要遍历有重复字符的数据;如果没有字符数量大于1的,则返回-1
  3. 循环遍历有重复数据的字符,先通过find从左边开始查找字符串s中第一个匹配的字符,返回下标;然后通过rfind从右往左开始查找第一个匹配的字符,返回下标,然后计算距离;
  4. 将所有重复字符间的距离参数添加到空列表d中,然后通过max返回最大的

三、AC 代码:

class Solution(object):
    def maxLengthBetweenEqualCharacters(self, s):

        b = set(s)
        c = []
        d = []
        for i in b:
            sum = s.count(i)
            if sum>1:
                c.append(i)
            else:
                pass
        if len(c)>0:
            for j in c:
                start = s.find(j)
                end = s.rfind(j)
                distance = end - start -1
                d.append(distance)
            return max(d)
        else:
            return -1

四、参考:

【golang】维护每个字母第一次出现位置 - 两个相同字符之间的最长子字符串 - 力扣(LeetCode)