Medium
https://leetcode.com/problems/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.public class Solution { public int lengthOfLongestSubstring(String s) { Map<Character, Integer> map = new HashMap<>(); int start = 0, end = 0; int counter = 0, len = 0; while(end < s.length()){ char cur = s.charAt(end); if(!map.containsKey(cur)) map.put(cur, 0); map.put(cur, map.get(cur) + 1); if(map.get(cur) > 1) counter++;//substr contains repeats while(counter > 0){//just case of 2 repeating char in substr char c2 = s.charAt(start); map.put(c2, map.get(c2) - 1); if(map.get(c2) > 0) counter--; start++; } len = Math.max(end - start + 1, len); end++; } return len; } }
参考: https://discuss.leetcode.com/topic/8232/11-line-simple-java-solution-o-n-with-explanation
思路2: Create a HashMap to store <character, last occurrence position>
Two pointer: i (right) iterate string;
j (left) track the position of last dup char. (only move forward so maintain get the max of j)
eg: a(j=0)b(j=1)b(j=2)a(j=2) so i = 3 , j =2, len = 3 - 2 + 1 = 2
max: the max length i-j+1
Complexity: Time O(1) HashMap O(N)
public class Solution { public int lengthOfLongestSubstring(String s) { if (s.length()==0) return 0; HashMap<Character, Integer> map = new HashMap<Character, Integer>(); int max=0,j =0;//j is left pointer -to pos of last occurrence of the dup char for (int i=0; i<s.length(); i++){ if (map.containsKey(s.charAt(i))){ j = Math.max(j,map.get(s.charAt(i))+1);//only move forward(max),else eg: abba, last a: 3=3(i)-(0+1)(j) + 1 } map.put(s.charAt(i),i); max = Math.max(max,i-j+1); } return max; } }
No comments:
Post a Comment