给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
示例 2:
输入: “bbbbb”
输出: 1
示例 3:
输入: “pwwkew”
输出: 3
解法
(暴力解法复杂度O(n3)的就不说了)-_-
1、使用HashSet进行
时间复杂度:O(n)(ps:最坏情况O(2n))
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
HashMap<Character,Integer> map = new HashMap<>();//char(字符)做Key,Int(字符在串中的位置)做Value
int maxSubStr=0;
int pre = 0,after = 0;
while(after<len){
if(map.containsKey(s.charAt(after))){ //表中已存在该Key
pre = Math.max(map.get(s.charAt(after)),pre); //pre后移至与将插入元素相冲突的Key位置
}
map.put(s.charAt(after),after+1); //将新Key值加入Map中
after++;
maxSubStr = Math.max(maxSubStr,after-pre);//更新目前最长无重复子串长度
}
return maxSubStr;
}
}
2、使用HashMap进行
时间复杂度:真正意义上的O(n),只需要after指针移动n次即可
class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
HashSet<Character> set = new HashSet<>();
int maxSubStr=0;
int pre = 0,after = 0;
while(pre<len && after<len){
if(set.contains(s.charAt(after)) == false){//Set中不包含该元素
set.add(s.charAt(after++)); //添加元素
maxSubStr = Math.max(maxSubStr,after-pre); //旧新子串长度比较
}else{
set.remove(s.charAt(pre));
pre++;
}
}
return maxSubStr;
}
}