持续创作,加速成长!这是我参与「掘金日新计划 · 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,则添加到空列表中,最后只需要遍历有重复字符的数据;如果没有字符数量大于1的,则返回-1
- 循环遍历有重复数据的字符,先通过find从左边开始查找字符串s中第一个匹配的字符,返回下标;然后通过rfind从右往左开始查找第一个匹配的字符,返回下标,然后计算距离;
- 将所有重复字符间的距离参数添加到空列表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
四、参考: