1624. 两个相同字符之间的最长子字符串【模拟】
题目
给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1 。
子字符串 是字符串中的一个连续字符序列。
难度:简单
提示:
1 <= s.length <= 300
s
只含小写英文字母
题解
题目要求两个相同字符之间的最长字符串长度,就需要找到左右两个相同字符的位置,如果有某个字符,那么我们可以固定它为左边位置(同理也可以固定为右边位置),第一次遇到它就固定为左位置,第二次遇到直接判断长度与当前已拥有最长值的关系即可。并且字符只有小写英文字母,那么,我们可以通过建立一个数组记录该字符第一次出现的位置,比map更快。
class Solution {
public int maxLengthBetweenEqualCharacters(String s) {
if (s.length() < 3) {
return 0;
}
int[] cnts = new int[26];
int res = Integer.MIN_VALUE;
Arrays.fill(cnts, -1);
char[] chars = s.toCharArray();
for (int i = 0; i < s.length(); i++) {
if (cnts[chars[i] - 'a'] == -1) {
cnts[chars[i] - 'a'] = i;
} else {
res = Math.max(res, i - cnts[chars[i] - 'a'] - 1);
}
}
return res == Integer.MIN_VALUE ? -1 : res;
}
}
复杂度分析
- 时间复杂度:O(1),只申请了常量空间
- 空间复杂度:O(n),只顺序遍历一遍