题目:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
思路:
不重复的最长子串,不重复需要用到去重,最长需要截取长度,所以用map存储字符和字符的下标,重复时,能知道重复下标,便于重新获取长度。
示例代码:
public int lengthOfLongestSubstring(String s) {
// 长度
int num = 0;
// 起始位置
int start = 0;
int length = s.length();
Map<Character, Integer> strMap = new HashMap<Character, Integer>();
for (int i = 0; i < length; i++) {
char str = s.charAt(i);
// 如果集合包含当前字符,说明已经重复,起始位置变化,留最大值是为了拿到最新的不重复起始点,
// +1是因为下标位置的字符是重复的,所以那个字符不能算
if (strMap.containsKey(str))
start = Math.max(start, strMap.get(str) + 1);
// num保留循环时,最大的值
num = Math.max(num, i - start + 1);
strMap.put(str, i);
}
return num;
}
牛人写法,在力扣评论里看到的,经典在下面那个 int index = s.charAt(i); java会根据ASCII转换字符
public int lengthOfLongestSubstring(String s) {
// 记录字符上一次出现的位置
int[] last = new int[128];
for(int i = 0; i < 128; i++) {
last[i] = -1;
}
int n = s.length();
int res = 0;
int start = 0; // 窗口开始位置
for(int i = 0; i < n; i++) {
int index = s.charAt(i);
start = Math.max(start, last[index] + 1);
res = Math.max(res, i - start + 1);
last[index] = i;
}
return res;
}