题目描述
给定一个字符s,请你找出其中不含有重复字符的最长子串的长度。
示例:
1)s="abcabcbb" ==> 3
2) s = "bbbbb" ==> 1
3) s = "pwwkew" ==> 3
4) s = "" ==> 0
解题思路: 滑动窗口,用两个指针,假设为left和right, 用right指针前移去探索可能解,用left指针前移去寻找最优解。
代码
#include <iostream>
#include <string>
#include <map>
int max_diff_len(std::string str) {
int n = str.size();
if (n <= 0) {
return 0;
}
int len = 0;
int left = 0;
int right = 0;
std::map<char, int> cnt_mp;
while (right < n ) {
char rch = str[right];
cnt_mp[rch]++;
while (left <= right && cnt_mp[rch] > 1) {
char lch = str[left];
cnt_mp[lch]--;
left++;
}
len = std::max(len, right - left + 1);
right++;
}
return len;
}
int main()
{
// case1
std::string str = "abcabcbb";
std::cout << str << ": max_len: " << max_diff_len(str) << std::endl;
// case2
str = "bbbbb";
std::cout << str << ": max_len: " << max_diff_len(str) << std::endl;
// case3
str = "pwwkew";
std::cout << str << ": max_len: " << max_diff_len(str) << std::endl;
// case4
str = "";
std::cout << str << ": max_len: " << max_diff_len(str) << std::endl;
return 0;
}
结果输出如下:
abcabcbb: max_len: 3
bbbbb: max_len: 1
pwwkew: max_len: 3
: max_len: 0