力扣-无重复字符的最长子串
方法一:暴力枚举
我的原始做法:使用临时数组依次存下子串,每次遍历是否重复
class Solution { public int lengthOfLongestSubstring(String s) { int leng=s.length(); char[] temp = new char[leng];//用c语言的思路做的,其实改成HashSet可以省一层循环 int max=0; int k=0; if(leng==1)return 1; for(int i= 0;i<leng-1;i++){ k=0; temp[k++]=s.charAt(i); for(int j=i+1;j<leng;j++){ boolean flag = false; for(int z=0;z<k;z++){ if(s.charAt(j)==temp[z]){ flag = true; } } if(flag==false){ temp[k++]=s.charAt(j); }else{ break; } } if(k>max){ max=k; } } return max; } }
方法二:滑动窗口
看过题解后按自己的思路改进的,主思路依然是分别从0,1,...开始数最长的子串,只不过通过哈希和滑动窗口的引入,省去了重复遍历中间那一截:
class Solution { public int lengthOfLongestSubstring(String s) { int n=s.length(); int max=0; int left = 0; HashSet<Character> ha = new HashSet<>(); for(int i=0;i<n;){ if(!ha.contains(s.charAt(i))){//不重复,放入哈希,右指针后移 ha.add(s.charAt(i)); i++; max = ha.size()>max?ha.size():max;//更新字串的最大长度 } else{ ha.remove(s.charAt(left));//重复,左指针+1,从下一个字符开始数子串 left++; } } return max; } }
浙公网安备 33010602011771号