题目
给你一个字符串 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
只含小写英文字母
解题
方法一:哈希表 一次遍历
思路
维护一个哈希表(firstSeen
),记录每个字符第一次在字符串中出现的下标。
遍历字符串,如果当前字符还没在字符串中出现过,就把下表放入哈希表;否则算出当前字符的位置与它第一次出现位置的距离,然后维护最大长度(maxLne
)即可。
代码
class Solution {
public int maxLengthBetweenEqualCharacters(String s) {
int[] firstSeen = new int[26];
Arrays.fill(firstSeen, -1);
int maxLen = -1;
for (int i = 0; i < s.length(); ++i) {
int curr = s.charAt(i) - 'a';
if (firstSeen[curr] == -1) firstSeen[curr] = i;
else maxLen = Math.max(maxLen, i - firstSeen[curr] - 1);
}
return maxLen;
}
}
class Solution {
public:
int maxLengthBetweenEqualCharacters(string s) {
int first_seen[26];
memset(first_seen, -1, sizeof(first_seen));
int max_len = -1;
for (int i = 0; i < s.length(); ++i) {
int curr = s[i] - 'a';
if (first_seen[curr] == -1) first_seen[curr] = i;
else max_len = max(max_len, i - first_seen[curr] - 1);
}
return max_len;
}
};
评论区