题意:
找到不含重复字符的最长子串。
思路:最开始的思路是枚举起点和终点,但是很快否决了,因为O(N^2)的时间复杂度太高了。。之后想用二分,但是仔细想了一下发现二分对于这种要求 连续的题目其实并不是特别适合。后来想到贪心,但是开始的时候贪心的思路错了。起点的思路是对的,一定是由于某个字符出现重复来重置起点;但是 终点不在第二次出现该字母的地方,而是继续往后,直到该字母出现第三次或者到了字符串结尾。也就是说我们记录字符的出现位置(ASCII,数组小于200), 当某个字母第二次出现时我们抛掉第一次出现,从第一次后计算包含第二次在内的最长子串。O(N)的时间复杂度。
第一次写的代码到第二次出现停止了,对于样例:asjrgapa输出错误结果!
后来参考了别人的代码AC,但是觉得很亏,本来自己可以的,差一点。
代码实现:
#include <cstring>
#include <cmath>
using std::string;
using std::max;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
int sta = -1;
int pos[200];
int res = 0;
memset(pos,-1,sizeof(pos));
for( int i = 0; i < len; i++ ){
int tmp = (int)s[i];
if( pos[tmp] > sta ){
sta = pos[tmp];
}
pos[tmp] = i;
res = max(res,i-sta);
}
return res;
}
};