3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
public class Problem_0003_LongestSubstringWithoutRepeatingCharacters {
// 最长子串问题,思路:遍历字符串每个下标位置i,以i为结尾位置往左推,得到每个位置最长无重复子串,然后得到最大值即可。
/*
* 分两种情况(1)、i位置往左推,推不动的地方 (2)、i-1位置往左推,推不动的地方 两种情况求最大值,就是i位置最长的子串
*/
public int lengthOfLongestSubstring(String s) {
if (s == null || s.equals("")) {
return 0;
}
char[] str = s.toCharArray();
// 字符大小写,数字空格对应的ASCII值都不超过127,值为上次出现的位置
int[] map = new int[128];
for (int i = 0; i < 128; i++) {
map[i] = -1;
}
int len = 0;
// i-1位置结尾的情况下,往左推,推不动的位置是谁,比如 2167891,1的pre为数字2的下标位置
int pre = -1;
for (int i = 0; i < str.length; i++) {
pre = Math.max(map[str[i]], pre);
int cur = i - pre;
len = Math.max(len, cur);
map[str[i]] = i;
}
return len;
}
}
思路:遍历字符串每个下标位置i,以i为结尾位置往左推,得到每个位置最长无重复子串,然后得到最大值即可。
影响最长子串有两个关键位置
- i位置元素上次出现的位置
- i - 1 位置结尾往左推了多远
看代码思路不清晰,画个图就一目了然了。