3. Longest Substring Without Repeating Characters
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.
本题和longest substring with at most two distinct characters有点像,只不过本题是不能出现重复的character,那道题说的是不能超过两个,看了答案的做法,想法是,遍历字符串,用一个hashmap来存储字符和其索引,如果出现了重复的字符,则将双指针里面的低指针指向出现该重复字符的最后一个索引+1,如果没有出现重复字符,则将当前字符加入hashmap里面,并且计算一次最大长度,代码如下:
1 public class Solution { 2 public int lengthOfLongestSubstring(String s) { 3 int len = 0; 4 int hi = 0; 5 int lo = 0; 6 Map<Character,Integer> map = new HashMap<Character,Integer>(); 7 for(;hi<s.length();hi++){ 8 if(map.containsKey(s.charAt(hi))){ 9 lo = Math.max(lo,map.get(s.charAt(hi))+1); 10 } 11 map.put(s.charAt(hi),hi); 12 len = Math.max(len,hi-lo+1); 13 } 14 return len; 15 } 16 }
本题不可以用Longest Substring with At Most Two Distinct Characters的方法做,是因为,那道题是每次删除索引map里面最前面的字符的最前索引值的字符,而这道题是删除重复出现的字符的索引值,也就是说,一个允许重复char出现,一个不允许。