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;
}
}