给定一个字符串,找出最长的不具有重复字符的子串的长度。
例如,“abcabcbb”不具有重复字符的最长子串是“abc”,长度为3。
对于“bbbbb”,最长的不具有重复字符的子串是“b”,长度为1。
//解法一,暴力搜索法
#include<unordered_map>
class Solution {
public:
/**
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
// write code here
if (s.empty())
return 0;
int maxlen = 0;
//搜索所有子串
//从每一个字符开始的,所有可能长度的字符串
for (int start = 0; start < s.size(); ++start) {
for (int length = 1; length <= s.size() - start; ++length) {
//构造子串
string tmp = s.substr(start, length);
//统计每个子串的字符个数
unordered_map<char, int> count;
for (const auto& e : tmp) {
++count[e];
}
//标记是否没有重复字符
int flag = 1;
for (const auto& e : count) {
if (e.second != 1)
flag = 0;
}
//更新最大长度
if (flag && maxlen < length) {
maxlen = length;
}
}
}
return maxlen;
}
};
//解法二,滑动窗口法
//string str;
//str=str[0];
//窗口界限
int start=0,end=0;
//记录窗口有哪些字符
set<char> st;
//滑动窗口
for(end=0;end<s.size();++end){
//如果发现窗口新出现的字符已经出现过,则start向左滑动缩小
//窗口,直到无重复字符
while(start<=end&&st.find(s[end])!=st.end()){
st.erase(s[start]);
++start;
}
//记录每个合法窗口的长度
maxlen=max(maxlen,end-start+1);
//更新窗口字符表
st.insert(s[end]);
}
if(maxlen==INT_MIN)
return 0;
return maxlen;