思路:用一个128长度的boolean数组存放所有ASCII码中的符号,初始化都为false表示没有访问过,双指针i,j初始指向0,遍历给定字符串所有字符。如果j所指字符未访问,则将该字符改为已访问,并向右移;否则j访问的字符表示已访问,len取当前长度和j-i的最大值,并且将i移动到和j所指字符重复的字符的位置+1,j++。最后还要比较len取最大值。
时间复杂度:O(n)
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0){
return 0;
}
Boolean[] zifu=new Boolean[128];
for(int i=0;i<128;i++){
zifu[i]=false;
}
int i=0;
int j=0;
int len=0;
while(j<s.length()){
if( zifu[s.charAt(j)]==false){
zifu[s.charAt(j)]=true;
j++;
}
else{
len=Math.max(len,j-i);
while(i<j && s.charAt(i)!=s.charAt(j) ){
zifu[s.charAt(i)]=false;
i++;
}
//zifu[s.charAt(i)]=false;//不可以这样,因为当前所指不一定就和i所指重复,可能和i到j之间的某个字符重复。
i++;
j++;
}
}
len=Math.max(len,j-i);
return len;
}
}