给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
程序员文章站
2022-07-13 21:29:42
...
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner intput= new Scanner(System.in);
System.out.println("please input string!!!");
String str = intput.nextLine();
ArrayList Alist = new ArrayList();
ArrayList Blist = new ArrayList();
if(str.length()==0){
System.out.println(Blist.size());
}else{
for(int i=0;i<str.length();i++){
for(int j=i;j<str.length();j++){
if(!Alist.contains(str.charAt(j))){
Alist.add(str.charAt(j));
if(Blist.size()<=Alist.size()){
Blist.clear();
Blist.addAll(Alist);
}
}else{
Alist.clear();
Alist.add(str.charAt(j));
}
}
}
}
System.out.println(Blist.size());
/*Iterator<String> it =Blist.iterator();
while(it.hasNext()){
System.out.println(it.hasNext());
}
String Str=String.join(",",Blist.toString());
System.out.println(Str);
*/
}
注意:代码略有修改,但可以用,只是多个Blist,可以将Blist换成int num(这样可以节省内存)
copy别人的代码
比较厉害的解法:
这道题主要用到思路是:滑动窗口
什么是滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
时间复杂度:O(n)
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
int[] index = new int[128]; // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j)], i);
ans = Math.max(ans, j - i + 1);
index[s.charAt(j)] = j + 1;
}
return ans;
}
}