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

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

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 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;
    }
}

你可能感兴趣的:(算法编程,Java)