leetcode3. Longest Substring Without Repeating Characters
思路
- 用一个数组保存当前迭代过程内的子串中每个字符出现的位置charPos,用hash的方式,并初始化-1(初始化的值不能是任何可能的位置值,如0);
- 定义一个游标指针,扫描字符串s,如果当前的字符在本次子串中没有重现(charPos[s[curPos]]<-1),更新该子串长度、该子串所有字符出现的位置数组和当前的游标,如果当前的字符在本次子串中重现了(charPos[s[curPos]]>-1),那么,更新最大子串长度,重置位置记录数组charPos和子串长度,并更新游标;
- 循环2,知道游标遍历了数组;
- 考虑最后一个子串的情况(游标已经遍历数组,但是因为没有遇到重现的情况,导致最后一个字符长度和当前最长长度没有进行对比),最后返回;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int charPos[130] = { 0 };
memset(charPos, -1, 130 * sizeof(int));
int size = s.size();
int curPos = 0;
int curLen = 0;
int maxLen = 0;
while (curPos < size)
{
if (charPos[s[curPos]] <= -1) {
curLen++;
charPos[s[curPos]] = curPos;
curPos++;
}
else {
maxLen = curLen > maxLen ? curLen : maxLen;
curLen = 0;
curPos = charPos[s[curPos]] + 1;
memset(charPos, -1, 130* sizeof(int));
}
}
maxLen = curLen > maxLen ? curLen : maxLen;
return maxLen;
}
};