leetcode -day21 Longest Substring Without Repeating Characters



1、Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

分析:看到此题想到设置一个next数组,将出现的每个字母的下一个标出,这样最大不重复的长度为某一段中next值的最小值,但是不好操作;然后想到用哈希表存储元素是否出现过,但是还需要知道出现的位置才能实现长度计算,设置一个left标记不重复串的起点,往后遍历,更新哈希表,当遇到已经出现在哈希表中的值时,此段的不重复长度为当前位置-left,更新最大长度,设置left为从上一次出现的位置后面开始,同时清空哈希表中前一段的值继续上述操作。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    	int len = s.size();
		if(len <= 1)	return len;
		vector<bool> chars(256, false);//用于判断字母是否出现过
		vector<int> position(256, 0); //保存字母出现的位置
		int left = 0; //左侧点
		int cur = 0; //从头开始
		int ret = 0; //最大长度
		while(cur < len)
		{
			char ch = s.at(cur); 
			if(!chars[ch]) //如果没有出现过
			{
				chars[ch] = true; 
				position[ch] = cur; 
			}
			else  //如果出现过,则更新最大长度,下次从上一同字母的位置开始计算长度
			{
				ret = max(ret, cur - left); //更新最大长度
				for(int i = left; i < position[ch]; ++i)  
					chars[s.at(i)] = false;
				left = position[ch] + 1;//从上次出现的位置开始
				position[ch] = cur; 
			}
			++cur;
		}
		return max(ret, cur - left);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值