1.题目描述:
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
2.思路:
a.用vector实现,一个装下标,一个装对应的数值;
b.然后开始遍历,如果当前字符在vector出现过,就将当前元素以及之前的全部删除(但要记得将当前字符装进去,我就是忘记装当前的元素,导致只有一部分结果对,调试半天),使得数组中储存的永远是不含有重复字符的最长子串
3.代码:
初始版本(没有优化前的):
就中间有点啰嗦,但最初的想法就是写出来的这个代码,最终写完之后,看到中间有冗余的部分,才选择优化的。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int lengthOfLongestSubstring(string s) {
int sz = s.size();
if (sz < 1)
return 0;
int maxNum = 0;
int cnt = 0;//计数
vector<int>index;//储存下标
vector<char>data;//储存值与index对应
for (int i = 0;i < sz;i++) {
if (count(data.begin(),data.end(),s[i])==0) {//没找到
index.push_back(i);
data.push_back(s[i]);
cnt = data.size();
}
else {//找到了就删除一下
cnt = data.size();
//将与它相同的那个元素之前以及这个元素全部删除
int gap = find(data.begin(), data.end(), s[i]) - data.begin()+1;
index.erase(index.begin(), index.begin() + gap);
data.erase(data.begin(), data.begin() + gap);//[0,gap)的删除掉
//把当前的插入
index.push_back(i);
data.push_back(s[i]);
}
maxNum = maxNum < cnt ? cnt : maxNum;
}
return maxNum;
}
int main() {
string s;
cin >> s;
cout << lengthOfLongestSubstring(s) << endl;
}
最终版本:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int lengthOfLongestSubstring(string s) {
int sz = s.size();
if (sz < 1)
return 0;
int maxNum = 0;
int cnt = 0;//计数
vector<int>index;//储存下标
vector<char>data;//储存值与index对应
for (int i = 0;i < sz;i++) {
if (count(data.begin(), data.end(), s[i]) != 0) {//找到了就删除一下
cnt = data.size();
//将与它相同的那个元素之前以及这个元素全部删除
int gap = find(data.begin(), data.end(), s[i]) - data.begin() + 1;
index.erase(index.begin(), index.begin() + gap);
data.erase(data.begin(), data.begin() + gap);//[0,gap)的删除掉
}
//把当前的插入
index.push_back(i);
data.push_back(s[i]);
cnt = data.size();
maxNum = maxNum < cnt ? cnt : maxNum;
}
return maxNum;
}
int main() {
string s;
cin >> s;
cout << lengthOfLongestSubstring(s) << endl;
}