版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuweiyuxiang/article/details/83143181
1 题目
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 无重复字符的最长子串是 “abc”,其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 无重复字符的最长子串是 “b”,其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 无重复字符的最长子串是 “wke”,其长度为 3。
请注意,答案必须是一个子串,“pwke” 是一个子序列 而不是子串。
题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
2 解法
2.1 暴力求解法
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxlength = 0;
for(int i = 0;i < s.size();i++){
string sub(1,s[i]);
for (int j = i+1; j < s.size();j++){
if(sub.find(s[j]) == string::npos){
sub.append(1,s[j]);
}else{
break;
}
}
if(sub.size() > maxlength){
maxlength = sub.size();
}
}
return maxlength;
}
};
2.2 滑动窗口法
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//滑动窗口的方法
int start=0;
int end = 0;
int maxlength = 0;
string sub;
for(; end < s.size() && start < s.size(); ){
if(sub.find(s[end]) == string::npos){
//cout<<"if:"<<end<<endl;
sub.append(1,s[end]);
end++;
if(end - start > maxlength){
maxlength = end - start;
}
}else{
//cout<<"else:"<<sub.size()<<endl;
//cout<<"sub:"<<sub<<endl;
sub = sub.erase(0,1);
start++;
}
}
return maxlength;
}
};
2.3 优化的滑动窗口法
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//优化的滑动窗口的方法
int start=0;
int end = 0;
int maxlength = 0;
string sub;
int loc;
for(; end < s.size() && start < s.size(); ){
loc = sub.find(s[end]);
if(loc == string::npos){
//cout<<"if:"<<end<<endl;
sub.append(1,s[end]);
end++;
if(end - start > maxlength){
maxlength = end - start;
}
}else{
//cout<<"else:"<<sub.size()<<endl;
//cout<<"sub:"<<sub<<endl;
sub = sub.erase(0,loc+1);
start = start + loc+1;
}
}
return maxlength;
}
};
心得: string类型的相关操作函数不是很熟练,需要加强。