最长不重复子串

双指针,用一个hash保存子串已经存在的字符,这里使用一个int数组,如果字符存在,那么hash[char]=1;
举个例子:abcbd,q指针一直向前走,当走到第二个b的时候,令p向前走,一直走到第一个p,q每次都令hash为1,p每次令hash为0;

import java.util.*;
public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int lengthOfLongestSubstring (String s) {
        if(s==null || s.length()<=0){return 0;}
        if(s.length()==1){return 1;}
        int p=0,q=0,len=0,res=0;
        // 判断字符是否存在的hash表
        int[] hash=new int[128];
        while(q<s.length()){
            if(hash[s.charAt(q)]==0){
                hash[s.charAt(q)]=1;
                len++;
            }else{
                while(s.charAt(p)!=s.charAt(q)){
                    hash[s.charAt(p)]=0;
                    len--;
                    p++;
                }
                // 这个时候,p,q指向同一个字符,令p向前一步,但是len不减,因为q指向被算入了len
                p++;
            }
            res=Math.max(res,len);
            q++;
        }
        return res;
    }
}