本来在leetcode里面搜的是哈系表相关算法练习,把这个题做完后,感觉没用到相关知识[哭笑一波 ?]
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
简单说一下这个题,他想要求的是字符串中无重复字符的字串的最大长度,最初用暴力解法来做的,时间复杂度为O(n^3)结果是超时,最后就选用滑动窗口机制来解决,时间复杂度为O(n^2).
#include <iostream>
#include<string>
#include<vector>
#include<iterator>
using namespace std;
class Solution{
public:
int isContain(char ch ,vector<char>ss){
for(int i=0;i<(int)ss.size()-1;i++){
if(ss[i]==ch){
return i;
}
}
return -1;
}
//使最左端窗口向右滑动
void remove(int st,vector<char>&ss){
vector<char>::iterator iter ;
int i =0;
//删除容器中下标为st及之前的所有元素
for(iter=ss.begin();iter!=ss.end();){
ss.erase(iter);
if(i==st)break;
i++;
}
}
int lengthOfLongestSubstring(string s) {
int i=0,j;
j=i+1;
int ans=1;
//如果是空串,返回0
if(s==""){
return 0;
}
//如果是空格串,返回1
if(s==" "){
return 1;
}
int st;
int l;
//相当于一个窗口
vector<char>ss;
//开始降低一个元素放进容器
ss.push_back(s[i]);
int len = (int)s.length();
while(j<len){
//遍历字符串,并将遍历的字符放进容器,相当于使最右端窗口向右滑动
ss.push_back(s[j]);
//计算容器的容量
l = (int)ss.size();
//要是容器中前面的元素有和最后一个元素相同的字符
if((st=isContain(s[j],ss))!=-1){
l = (int)ss.size()-1;
//就将这个字符在容器中的位置找到即st记录
remove(st,ss);
}
ans = ans>l?ans:l;
j++;
}
return ans;
}
};
int main()
{
Solution ss ;
string a ;
//注意,应该用getline接收一行的输入,因为输入是空格时,cin不会识别
getline(cin,a);
int n =ss.lengthOfLongestSubstring(a);
cout<<n<<endl;
return 0;
}