#3 longest substring
问题分析: 这道题第一想法也是想着用嵌套for循环来穷举,但是有了前面的经验,我认为一定会time limit,所以琢磨了一下,采用“哈希”的做法,根据ASCII码将字符哈希到数组,数组值为字符在string中的下标。解决问题的关键在于当出现重复字符时,提前记录下前面的substring的长度ans,将prePos移到到由重复字符开始的新的substring的下标值,继续curPos游动找到新的substring的最大长度与已有的ans比较,如果小于ans则保留and的值,继续找。那么如何使得当重读出现时移动prePos到下一个substring第一个字符的下标值呢
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int index[128] = {0};
// memset(index, 0, 128);
int ans = 0;
int len = s.length();
int prePos = 0, curPos = 0;
while(curPos < len) {
prePos = max(index[s[curPos]], prePos);//[2]
ans = max(ans, curPos-prePos+1);
index[s[curPos]] = curPos + 1; // [1]
curPos++;
}
return ans;
}
int max(int a, int b) {
if(a < b) return b;
else return a;
}
};
直观上[1]出应该是index[s[curPos]] = curPos;,但是index[s[curPos]] 已经不影响ans,并且为了计算当重复出现prePos的值,与[2]结合,则当出现重复时,prePos就移到那里去了,注意到一开始index的值都是0,也就是prePos保持为0如果没有重复出现的话