无重复字符的最长子串【c++数组实现】O(n)复杂度

本文介绍了如何使用C++数组方法,在线性时间复杂度O(n)下解决找到字符串中无重复字符的最长子串问题。通过滑动窗口策略,动态维护一个无重复字符的子串,更新最大长度。
int lengthOfLongestSubstring(string s) {
	int iv[128]; for (int i = 0; i < 128; i++) iv[i] = -1;
	//用一个数组来储存每个字符最后出现的位置,默认值为-1,即为未出现过
	int lp = 0; int rp = 0;
	//定义两个指针来确定子字符串的边界
	int result = 0;
	while (rp < s.size()) {
		if (iv[s[rp]] < lp) iv[s[rp]] = rp;
		//该字符未出现过,或者出现过但是在左指针的左边,记录位置
		else {
			int size = rp - lp; 
			if (size > result) result = size;
			lp = iv[s[rp]] + 1;   //将左指针移到重复字符的下一位
			iv[s[rp]] = rp;  //更新位置
		}
		rp++;
	}
	int size = rp - lp; if (size > result) result = size;
	return result;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值