LeetCode 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.

 

记录暂时的最大长度、扫描中的子串中各个字符的序号、子串的头、子串的尾。

子串尾从头开始向后扫一次:

1、如果字符未在子串中出现过,考虑目前子串长度是否超过暂时的最大

2、如果出现过,将子串头到上次出现该字符之间的字符都标记为未出现,子串头变为上次出现位置之后的那个位置

 

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
		long pos[128];	//记录相应字符的位置,-1表示不再扫描的子串上
		for(int i=0;i<128;i++)
			pos[i]=-1;
		long max=0;	//最大长度
		long first=0,last=0;	//扫描中的子串的头、尾
		while(last<s.size())
		{
			if(pos[s[last]]==-1)
			{
				pos[s[last]]=last;
				last++;
				if(last-first>max)
					max=last-first;
			}
			else
			{
				while(first<=pos[s[last]])
					pos[s[first++]]=-1;
				pos[s[last]]=last;
				last++;
			}
		}
		return max;
    }
};


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值