无重复字符的最长字串

目录

1、题目(leetcode第3题)

2、解题过程和思路

3、具体代码实现

 4、关于哈希集合函数的一些知识点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值