欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

程序员文章站 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;
    }
}