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.
思路:
从位置begin开始,一直找到end, str[end+1]为[begin, end]中的某个字符重复,即从begin开始,最大不重复字符子串长度为end - begin;
判断字符是否存在某个字符集中,暂时只想到 set
代码:
public int lengthOfLongestSubstring(String s) { int n = s.length(); int ans = 0; Set<Character> set = new HashSet<Character>(); for(int i = 0; i < n; i++){ if(n - i < ans) break; //剩余字符没有ans大,不需计算 set.clear(); for(int j = i; j < n; j++){ char c = s.charAt(j); if(set.contains(c)){ ans = Math.max(ans, j - i); break; } else set.add(c); } ans = Math.max(ans, set.size()); } return ans; }
优化:
假设[x, y]为从x开始的最大无重复字符子串,str[y+1]与[x, y]中的某个字符重复,可以肯定从[x+1, y]是没有重复字符的,如果有的话,在[x, y]的过程中就会出现,
所以从x+1位置开始,只需要set.remove(str[x]), 从y+1开始计算,set中的值就没有必要clear()
代码:
public class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(); int ans = 0; int pre = 0; Set<Character> set = new HashSet<Character>(); for(int i = 0; i < n; i++){ if(n - i < ans) break; //剩余字符没有ans大,不需计算 if(i > 0) set.remove(s.charAt(i-1)); while(pre < n){ char c = s.charAt(pre); if(set.contains(c)) break; else set.add(c); pre++; } ans = Math.max(ans, set.size()); } return ans; } }