一、暴力破解
#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;
}
}