题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思考
- 正向思维
- 若要确定最长子串,则需确定初始位置i,结束位置j。
- 如何在i→j这个长度内保证不含重复字符呢? 这就需要映射了,本来我打算使用map,可是这个区间窗口是会变化的,map删除元素时有点儿麻烦。于是,考虑数组a,索引保留字符值,数组的值等于这个字符当前的位置
- 接下来,就是确定这个区间窗口如何变化?初始位置 i 受后来j的加入的影响,如果j加入后的字符,在数组 a的位置比原来的大,那就说明存在重复的字符了,更新这个i到重复的位置。
注意:
- 字符串包括ASCII字符表内所有的字符,注意数组a初始化的范围。
- 由于字符串的长度可能为1,将初始位置 i 初始化为−1就行,这样,j = 0时,j-i= 1。
- 为了保留原来不存在重复字符时, i 的位置不受影响,需要将数组a的所有值初始化为−1.
题解
class Solution {
public int lengthOfLongestSubstring(String s) {
int i = -1;
int res = 0;
int[] a = new int[128];
Arrays.fill(a, -1);
for(int j = 0; j < s.length(); j ++) {
i = Math.max(i, a[s.charAt(j)]);
int cur = j - i;
res = Math.max(res, cur);
a[s.charAt(j)] = j;
}
// System.out.println(Arrays.toString(a));
return res;
}
}