算法第三题,求最长不重复子串。
left代表子串开始的位置,lastpos数组编号代表每个ASCII码,值记录上次出现这个ASCII码的字符的位置。从左到右扫描字符串,如果当前字符没有出现过,记录此字符在字符串中的位置;如果出现过,更新left值,并记录字符出现的新位置。每次扫描计算当前子串长度cur,取最大值。
class Solution {
public int lengthOfLongestSubstring(String s) {
int[] lastpos = new int[256];
int left = -1;
int ans=0;
Arrays.fill(lastpos, -1);
for (int i=0; i<s.length(); i++){
if (left < lastpos[s.charAt(i)])
left = lastpos[s.charAt(i)];
lastpos[s.charAt(i)] = i;
int cur=i-left;
if (ans < cur)
ans = cur;
}
return ans;
}
}