标签:
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.
Subscribe to see which companies asked this question
public class Solution { public int lengthOfLongestSubstring(String s) { if(s == null) return 0; int maxLen = 0; Map<Character, Integer> ind = new HashMap<Character, Integer>(); for(int i = 0; i< s.length(); ++i) { Character c = s.charAt(i); Integer location = ind.get(c); if(location == null) { ind.put(c, i); } else { Integer curLen = ind.size(); if(curLen > maxLen) { maxLen = curLen; } Map<Character, Integer> ind2 = new HashMap<Character, Integer>(); for(int j = location+1;j<=i;++j) { ind2.put(s.charAt(j), j); } ind = ind2; } } Integer curLen = ind.size(); if(curLen > maxLen) { maxLen = curLen; } return maxLen; } }
Improved Slow Version:
public class Solution { public int lengthOfLongestSubstring(String s) { if(s == null) return 0; int maxLen = 0; int start = 0; //improvement: instead of constructing a new map. Modify the original map by removing bad part. Map<Character, Integer> ind = new HashMap<Character, Integer>(); for(int i = 0; i< s.length(); ++i) { Character c = s.charAt(i); Integer location = ind.get(c); if(location == null) { ind.put(c, i); } else { Integer newStart = location+1; Integer curLen = ind.size(); if(curLen > maxLen) { maxLen = curLen; } for(int j = start;j<newStart;++j) { ind.remove(s.charAt(j)); //Improvement: remove bad part. } ind.put(c, i); start = newStart; } } Integer curLen = ind.size(); if(curLen > maxLen) { maxLen = curLen; } return maxLen; } }
More Improvements: No need to remove the bad part.
public class Solution { public int lengthOfLongestSubstring(String s) { if(s == null) return 0; if (s.length()==0) return 0; HashMap<Character, Integer> map = new HashMap<Character, Integer>(); int max=0; for (int i=0, j=0; i<s.length(); ++i){ Character c = s.charAt(i); Integer location = map.get(c); if (location != null){ j = Math.max(j, location + 1); //j points to START. } map.put(c,i); max = Math.max(max,i-j+1); } return max; } }
3. Longest Substring Without Repeating Characters
标签:
原文地址:http://www.cnblogs.com/neweracoding/p/5452212.html