目录
1、题目(leetcode第3题)
2、解题过程和思路
(1)我一看这个题目,就想到了双指针,打算使用双重循环来写代码,但是在写的过程中我发现如果使用双重循环的话还需要使用一个数组来存放遍历过的元素,但是如果使用普通的数组的话又要使用一个循环,这样会导致时间复杂度过高,最大可以达到O(n^3),这种解法太过于暴力了。但是尤为我没有想到更好的办法,所以我去看了一下题解,发现了一个我没有接触过的算法,那就是“滑块算法+hash集合表思想”的算法。
(2)滑块算法+hash集合表思想
①文字描述
这种方法中也要使用两个指针,另外还需要一个哈希表,在这种方法中两个指针分别为左指针和右指针。
右指针负责不断右移直到移动到字符串末尾,每次都要尝试把右指针指的元素放入表中,如果表中没有这个元素则放入反之则移动左指针;
左指针移动的条件为:右指针所指的元素在表中存在,此时将左指针所指元素从表中移除,左指针不断右移直到右指针所指元素可以放入表中。
②图示过程
3、具体代码实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char>hashset;
int length, maxLength, left, right;
length = maxLength = left = right = 0;
int n = s.size();
while (right < n)
{
if (!hashset.count(s[right]))
{
hashset.insert(s[right]);
right++;
length++;
if (length > maxLength)
maxLength = length;
}
else
{
while (hashset.count(s[right]))
{
hashset.erase(s[left]);
length--;
left++;
}
hashset.insert(s[right]);
length++;
right++;
}
}
return maxLength;
}
};
4、关于哈希集合函数的一些知识点
(1)头文件
#include <unordered_set>
(2)建立hash集合
unordered_set<Type>hashset;
(3)插入元素(增加元素)
hashset.insert(3);
hashset.insert(4);
(4)删除元素
hashset.erase(3);
(5)搜素某元素是否在集合中
hashset.count(元素);
//如果在则返回1,否则返回0