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;
	}
}
发布了107 篇原创文章 · 获赞 125 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/Li_haiyu/article/details/104449751
今日推荐