一开始以为是不连续的,其实要求子串是连续的。
想法:two-pointer O(n)时间,再借助256大小的int数组。
两个下标i,j(i<=j)。
对于i=0,找到最右侧的字符不重复的下标的后一位j。这就是i=0为左边界的串的最优解。然后i++。即考察i=1为左边界的情况。
如果此时[i,j]的串仍存在重复,那么肯定不是最终的最优解,继续i++。否则,j持续增1直到出现字符重复,即寻找当前i为左边界的最优解。
1 public class Solution { 2 //two pointer 3 public int lengthOfLongestSubstring(String s) { 4 int len = s.length(); 5 if( len==0 ) return 0; 6 int[] flag = new int[256]; 7 int ret=1,i=0,j=0; 8 9 flag[s.charAt(0)]=1; 10 while( (++j)<len ){ 11 flag[s.charAt(j)]++; 12 if( flag[s.charAt(j)]>1 ){ 13 ret = Math.max(ret, j-i); 14 while( flag[s.charAt(j)]>1 ){ 15 flag[s.charAt(i++)]--; 16 } 17 } 18 } 19 ret = Math.max(ret, j-i); 20 return ret; 21 } 22 }