这道题一眼看上去,就是一个可分序列中找最大最小的问题,对于这种类型的题目,我一般都会找前n个的最大或者最小,然后看看加上第n+1个元素,对原来的解答有哪些影响。这样做的一个好处是,可以比较清楚的知道自己需要维护哪些信息,写起来比较简单,但是效率却不一定是最高的。
对于这道题,用上述的方法,需要维护的信息就是到第n个元素,无重复序列的最大长度和包含第n个元素向前的无重复元素集合。
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0){
return 0;
}
int longest = 1;
Set<Character> content = new HashSet<>();
content.add(s.charAt(0));
for(int i = 1; i < s.length(); i++){
if(content.contains(s.charAt(i))){
int index = i;
content.clear();
while(true){
if(content.contains(s.charAt(index))){
break;
}
content.add(s.charAt(index--));
}
} else{
content.add(s.charAt(i));
if(content.size() > longest ){
longest = content.size();
}
}
}
return longest;
}
}