给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
使用list
使用list的情况下可以保存最长的字串什么样子,但是这道题不需要返回最长字串,所以list不好
class Solution {
public int lengthOfLongestSubstring(String s) {
//要考虑空字符,所以长度为0
int max = 0;
char[] chars = s.toCharArray();
//可以直接使用list,
List arrayList = new LinkedList();
for (char c : chars) {
if (arrayList.contains(c)) {
int pre = arrayList.indexOf(c);
//subList,左闭右开,取不到右边的索引的
arrayList=arrayList.subList(pre + 1, arrayList.size());
arrayList.add(c);
} else {
arrayList.add(c);
max = Math.max(max, arrayList.size());
}
}
return max;
}
}
HashMap
因为不需要返回字符串,所以使用map,key是字符,value是字符所在的索引的下一个值
- start是字串的起点,end是子串的重点,end一直往前走遍历整个字符串
- 后面与前面字符重复的话,start就会从重复的字符下一个开始,重新构建一个字串
- hashmap的key值是唯一的
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
//如何使用map
Map<Character, Integer> map = new HashMap<>();
for (int end = 0, start = 0; end < n; end++) {
char alpha = s.charAt(end);
if (map.containsKey(alpha)) {
start = Math.max(map.get(alpha), start);
}
ans = Math.max(ans, end - start + 1);
//hashmap中的key值是唯一的
map.put(s.charAt(end), end + 1);
}
return ans;
}
}