您的位置:首页 > 其它

LeetCode_003 Longest Substring Without Repeating Characters(greedy)

2016-12-19 21:47 369 查看
题意:找到不含重复字符的最长子串。
思路:最开始的思路是枚举起点和终点,但是很快否决了,因为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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  substring 贪心 ascii