无重复字符的最长子串
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
分析:
- 思路1:遍历
- 从下标0开始,每向后移动一次,就寻找以当前下标开始的最长子串,找出最长的返回
- 思路2:判断有没有重复元素
- 先将窗口设置为s.length大小,然后从下标0开始使用这个这个窗口中判断有没有重复,如果有,窗口大小-1,然后从0开始到下标1,判断这个窗口里有没有重复元素
- 思路3:滑动窗口
- 类似于GBN协议的方式,但是又有点不同
实现:
思路1:
public static int lengthOfLongestSubstring02(String s){
if(s.equals("")){
return 0;
}
ArrayList<Character> list=new ArrayList<>(s.length());
int count=0;
int maxcount=1;
for(int i=0;i<s.length();i++){
count=0;
for(int j=i;j<s.length();j++){
char ch=s.charAt(j);
if(!list.contains(ch)){
list.add(ch);
count++;
}else{
break;
}
}
if(count>maxcount){
maxcount=count;
}
list.clear();
}
return maxcount;
}
思路2:
public static int lengthOfLongestSubstring(String s){
ArrayList<Character> list=new ArrayList<>(s.length());
int count=0;
for(int i=0;i<=s.length()-1;i++){
// int i=1;//减去的长度
//int[] list=new int[s.length()];
for(int j=0;j<=i;j++){
int st=j;//开始下标
int len=s.length()-i;//查找多少个
int end=j+len-1;
boolean flag=true;
for(int k=st;k<=end;k++){
char ch=s.charAt(k);
if(!list.contains(ch)){
list.add(ch);
}else{//当有重复元素,就退出循环,并说明不是
flag=false;
break;
}
}
if(flag==true){
//System.out.println(len);
count=len;
break;
}
list.clear();
}
if(count!=0){
break;
}
}
return count;
}