Leetcode3--无重复字符的最长字串

一、暴力破解

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int process(string str) {
	if (str == "") return 0;
	vector<char> hash(128, 0);//ASCII码一共128个
	int max_num = -1;
	int start = 0;
	for (int i = 0; i < str.size(); ++i) {
		int temp = str.size() - i;
		if (max_num >= temp)
			return max_num;
		hash[str[i]] = 1;
		start += 1;
		max_num = max(max_num, start);
		for (int j = i + 1; j < str.size(); ++j) {
			if (hash[str[j]] == 0) {
				hash[str[j]] = 1;
				start += 1;
				max_num = max(max_num, start);
			}
			else {//否则,将start置零,hash置零从新开始
				start = 0;
				for (int i = 0; i < hash.size(); ++i)
					hash[i] = 0;
				break;
			}
					
		}
	}
	return max_num;
}
int main() {
	string str;
	while (getline(cin,str))
	{
		int result = process(str);
		cout << result << endl;
	}
}

存在未解决问题:

二、滑动窗口法

自己建立hash数组,left_side为滑动窗口左边界,i为右边界,如果出现重复元素,则更新左边界

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int process(string str) {
	if (str == "") return 0;//如果是空则返回0
	int left_side = 0;
	int max_num = -1;
	vector<char> hash(128, 0);//ASCII一共有128个,所以使用char类型即可
	for (int i = 0; i < str.size(); ++i) {
		hash[str[i]]++;//将当前元素的hash数组值加1
		if (hash[str[i]] == 1) //如果只有一个,则可以结算当前不重复的个数
			max_num = max(max_num, i - left_side+1);
		else {//否则移动左边界,直到将多余的字符移出窗口即可
			while (hash[str[i]]>1) {
				hash[str[left_side]]--;
				left_side++;
			}
		}
	}
	return max_num;
}
int main() {
	string str;
	while (getline(cin,str))
	{
		int result = process(str);
		cout << result << endl;
	}
}

上述代码优化一下

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int process(string str) {
	if (str == "") return 0;//如果是空则返回0
	int left_side = 0;
	int right_side = 0;
	int max_num = 0;
	vector<char> hash(128, 0);//ASCII一共有128个,所以使用char类型即可
	while (right_side<str.size()) {//使用右边界作为窗口判断截止条件
		if (hash[str[right_side]] == 0) {
			hash[str[right_side]]++;
			max_num = max(max_num, right_side - left_side + 1);
			right_side++;
		}
		else {
			hash[str[left_side]]--;
			left_side++;
		}
	}
	return max_num;
}
int main() {
	string str;
	while (getline(cin, str))
	{
		int result = process(str);
		cout << result << endl;
	}
}

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无情的搬砖机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值