一、题目
给你一个字符串 s
,请你返回 两个相同字符之间的最长子字符串的长度,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1
。
子字符串 是字符串中的一个连续字符序列。
二、示例
2.1> 示例 1:
【输入】s = "aa" 【输出】0 【解释】最优的子字符串是两个 'a' 之间的空子字符串。
2.2> 示例 2:
【输入】s = "abca" 【输出】2 【解释】最优的子字符串是 "bc" 。
2.3> 示例 3:
【输入】s = "cbzxy" 【输出】-1 【解释】s 中不存在出现出现两次的字符,所以返回 -1 。
2.4> 示例 4:
【输入】s = "cabbac" 【输出】4 【解释】最优的子字符串是 "abba" ,其他的非最优解包括 "bb" 和 "" 。
提示:
- •
1
<= s.length <=300
- •
s
只含小写英文字母
三、解题思路
根据题意,既然要计算两个相同字符直接的最长长度,那么我们可以将其保存在哈希表中,key=字符
value=下标
。那么,本题的约束条件中指明,s只包含小写英文字母,所以,我们可以采用数组结构来实现哈希表的功能,其中:
数组的下标:是字符的
ASCII码减97
(因为a的ASCII码是97,这样可以映射到数组的下标0的位置)。 数组存储的值:就是该字符第一次出现
的位置。
那么,我们遍历字符串s
中的每个字符,如果发现了重复的字符,计算长度即可,最终通过Math.max(...)
返回最长的字符串子串长度。具体操作如下图所示(为了便于描述,下图存储结构以哈希表存储):
四、代码实现
代码语言:javascript复制class Solution {
public int maxLengthBetweenEqualCharacters(String s) {
int result = -1;
int[] charIndex = new int[26];
Arrays.fill(charIndex, -1);
char[] sc = s.toCharArray();
for (int i = 0; i < sc.length; i ) {
if (charIndex[sc[i] - 97] == -1) charIndex[sc[i] - 97] = i;
else result = Math.max(result, i - charIndex[sc[i] - 97] - 1);
}
return result;
}
}