3.1 暴力求解
首先想到暴力法,找出所有子字符串,用哈希表逐个查看是否有相同元素。
public static int lengthOfLongestSubstring(String s) {
int max=1;
if(s==null||s.isEmpty()) return 0;
HashSet<Character> set=new HashSet<>();
for(int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
flag=0;
String sub=s.substring(i,j+1);//子串
int a=0;
for(a=0;a<sub.length();a++) {
if(!set.add(sub.charAt(a))){//无重复字符
break;
}
}
if(a==sub.length()) {
max=max>(sub.length())?max:(sub.length());
}
set.clear();
}
}
return max;
}
此方法时间复杂度为O(n^3),在题目最后一个用例测试时超时。
3.2 滑动窗口求解
首先设置left和right两个滑动指针,都赋值为0。使用maxlength存储最大长度,curlength存储当前滑动窗口长度。使用HashSet来判断是否有相同元素。开始时,两个指针都在字符串首部。当不存在相同元素时,将right指针对应的元素存入set中,同时curlength当前长度加一,right指针后移一位,给maxlength赋值max(curlength,maxlength)。当遇到相同元素时,从set中移除left指针所指元素,然后left指针后移,且curlength减一,循环操作,直到没有相同元素,此时就可以将right指针所指元素放入set,同时不要忘记后移right指针,并且curlength加一。当right指针到达字符串末尾时,循环结束。
class Solution {
public int lengthOfLongestSubstring(String s) {
int maxlength=0;
int curlength=0;
int left=0;
int right=0;
HashSet<Character> set = new HashSet<>();
while(right<s.length()){
if(!set.contains(s.charAt(right))){
set.add(s.charAt(right));
curlength++;
right++;
maxlength=maxlength>curlength?maxlength:curlength;
}else{
while(set.contains(s.charAt(right))){
set.remove(s.charAt(left));
left++;
curlength--;
}
set.add(s.charAt(right));
curlength++;
right++;
}
}
return maxlength;
}
}
测试通过。