无重复字符的最长子串(3)
3. 无重复字符的最长子串 - 力扣(LeetCode)
解法:
class Solution {
public:int lengthOfLongestSubstring(string s) {int result = 0;int left = 0;int right = 0;//题目中说s由英文字母、数字、符号和空格组成int ascii_set[128] = {0};for (; right < s.size(); ++right) {if (ascii_set[s[right]] == 1) {for (;left < right; ++left) {ascii_set[s[left]] = 0;if (s[left] == s[right]) {++left;break;}}}ascii_set[s[right]] = 1;result = max(result, right - left + 1);} return result;}
};
总结:
算法关键,双指针,left和right构成一个window。计算时间复杂度,遍历一遍数组需要O(N)的时间,由于每一个window最多是128个字符(无重复),所以第2个for循环不超过128,所以时间复杂度为O(N)。空间复杂度就是128的数组,常数,所以O(1)。
从实现上来看使用hash map 还是数组记录已经扫过的字符,经过比较,在leetcode上实验,数组的计算效率比hash map快1个数量级以上。