- 要求:从字符串中找出一个最长的不包含重复字符的子字符串,并计算该子字符串的长度。
- 示例:
"abcabcbb" 输出3 因为无重复字符的最长子串是"abc"
"bbbbb"输出1 因为无重复的最长子串是"b"
"pwwkew"输出3 因为无重复的最长子串是"wke"
- 使用Map对字符串内容进行记录,因为Map的特性是一个映射不能包含重复的键,一个键不能指向多个值,所以每次将字符记为键,在字符串中的索引记为值,每次更新值即可。
- 用一个值记录结果,每次更新结果,只要结果有变大就进行更新。
- 双指针:一个一直指向不重复字符串的首个字符的索引,另一个指针用来更新所指向的字符。
- 如果现有的map里包含这个键,那么就对键的索引进行更新,就是更新i,比较原先的i和现有的这个键对应的值的大小,哪个大就选用哪个。
- 往map里加键值对的时候,每次都往里加 字符-字符索引,j++不断后移进行遍历,对键值对进行更新。
- 其实就是,一个指针一直往后走,遍历,输入键值对。另一个指针,相当于是获取键对应的值,更改那个值,让i不断的一有重复元素就变换,最后返回的结果就是j-i+1;
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int res = 0;
int len = s.length();
for (int i = 0, j=0; j < len; j++) {
char ch = s.charAt(j);
if (map.containsKey(ch)) {
i = Math.max(i, map.get(ch));
}
res = Math.max(res, j-i+1);
map.put(s.charAt(j),j+1);
}
return res;
}
}