LeetCode_003 Longest Substring Without Repeating Characters(greedy)

来源:互联网 发布:淘宝店描述怎么写范例 编辑:程序博客网 时间:2024/05/17 01:32
题意:找到不含重复字符的最长子串。

思路:最开始的思路是枚举起点和终点,但是很快否决了,因为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;    }};



0 0
原创粉丝点击