您的位置:首页 > 其它

LeetCode 003 Longest Substring Without Repeating Characters

2016-04-29 01:14 295 查看
题目大意是给出一个字符串,要求其最长连续子串,连续子串中不能有重复字符(charactor)。

拿到题目首先应该问:字符串多长,内存是否存得下?当然在OJ上内存肯定是存得下的。然后要问字符串中的字符都是什么字符,只有小写字母吗?还是0~127的ASCII字符?又或者是0~255的ASCII字符?需要注意的是C++的string是signed char,如果是0~255的ASCII字符就需要转换成unsigned char。在这题里面只有0~127。还需要注意边界条件,假如输入的string是空串,程序会不会出错。

看到题目的第一反应是最暴力的方法,即枚举子串的开始点和结束点,并对每个子串扫描是否有重复的字符。这个算法的时间复杂度是O(n^3)。

然后考虑是否有更快的算法。就可以想到其实并不需要每次都扫描子串,因为在从开始点到原字符串末尾枚举子串结束点的时候,就可以顺便维护一个字符是否出现的列表,以此判断子串是否符合要求。时间复杂度是O(n^2)。

接着思考是否还可以降低时间复杂度,马上想到我们只需要维护一个区间,保证区间内的子串是满足要求的,并不需要枚举开始点和结束点。因为子串是连续的,一旦末尾加入了重复字符,再增长末尾也没有用了,所以直接前移开始点即可。所以算法就是:开始的区间仅含有第一个字符;前移结束点直到子串不满足要求,前移开始点。一直重复直到不能再前移开始点为止。时间复杂度为O(n)。空间复杂度为常数,因为只需使用一维数组记录每个字符是否出现。

因为我用的是C++,还可以再思考一下常数上的优化,比如使用迭代器而不是下标访问string,甚至直接使用指针访问string.c_str()。我试了一下,使用指针可以击败百分九十多的submission。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode