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。
拿到题目首先应该问:字符串多长,内存是否存得下?当然在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 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解