Leetcode 3.无重复字符的最长子串
题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
试过hashmap的方法,就是遍历整个字符串(1个for循环),把每个字符放入hashmap中,如果当前字符之前在hashmap中出现过,就将此字符和它之前的字符全部删除(第2个for循环),但是时间复杂度超了,发现要想时间复杂度不超,仍然需要类似双指针的方法对hashmap的方法中第2个循环做改进。一维坐标的动态规划应该也能做,但可能也会涉及到2个循环时的改进。
于是代码最后使用双指针进行了实现。思路比较简单(看下面代码和注释应该就能看懂)。代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (0 == s.length()) {
return 0;
}
int maxLen = 0;//两根指针间最大距离
int left = 0, right = 0;
for (right = 0; right < s.length(); ++right) {
//1. 对两根指针间元素遍历,如果有元素等于右指针就更新左指针
for (int i = left; i < right; ++i) {
if (s[i] == s[right]) {
left = i + 1;
}
}
//2. 维持最大窗长(即left与right之间的最大距离)
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
};