参考资料:《剑指offer》,《程序员代码面试指南》
思路:
对每一个位置str[i]来说,找它的以str[i]为end、最长、无重复字符的子串 的过程 相当于 尽可能以str[i]为end, 向左扩, 直至扩到 以str[i-1]为end、最长、无重复字符的子串的尽头(尽头1),或者 又遇到了 str[i]的相同字符 (即它最近一次出现,尽头2)会扩不动。尽头1和尽头2的最大值,就是 以str[i]为end、最长、无重复字符的子串 的开头。然后,记录长度cur,取所有cur的最大值,即为答案。
public int lengthOfLongestSubstring(String s) {if(s==null || s.length()==0){return 0;}char[] str = s.toCharArray();int[] map=new int[256];// <char,position>for(int i=0;i<256;i++){map[i]=-1; //since 0 means the first index, we must use other meaningless values to initialize 'map'}// LSs who ends up with [i], // dp[i-1] has its corresponding optimal start whose previous index is preint pre = -1;int cur = 0;// local optint ans=cur;// global optfor(int i=0;i<str.length;i++){pre = Math.max(pre,map[str[i]]);cur = i-pre;map[str[i]]=i;ans = Math.max(ans,cur);}return ans;}