Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
两种解法如下,都是使用滑动窗口法,只是使用的数据结构分别为Set和Map,时间复杂度为O(n)
PS:需要注意子串与子序列的区别,子串(子字符串)必须是连续的,而子序列不必连续
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by lxw, liwei4939@126.com on 2018/2/28.
*/
public class LongestSubstring {
public static int lengthOfLongestSubstring1(String str){
int len = str.length();
Set<Character> set = new HashSet<>();
int ans = 0, i=0, j=0;
while (i< len && j< len){
if(!set.contains(str.charAt(j))){
set.add(str.charAt(j++));
ans = Math.max(ans, j-i);
}
else {
set.remove(str.charAt(i++));
}
}
return ans;
}
public int lengthOfLongestSubstring2(String str){
int len = str.length();
int ans =0;
Map<Character, Integer> map = new HashMap<>();
for(int i=0, j=0; j<len; j++){
if(map.containsKey(str.charAt(j))){
i = Math.max(map.get(str.charAt(j)), i);
}
ans = Math.max(ans, j-i+1);
map.put(str.charAt(j), j+1);
}
return ans;
}
public static void main(String[] args){
LongestSubstring tmp = new LongestSubstring();
String str = "pwwkew";
int res = tmp.lengthOfLongestSubstring1(str);
System.out.println(res);
}
}