给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输
出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
自己用的算法是循环遍历字符串,标准是从查找到重复位的下一位开始。此方法时间复杂度较高。
提交代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxlenght = 0, flag = 0;
string tmp;
if (s.length() == 1){
return 1;
}
for (int i=0; i<s.length(); i++){
tmp = "";
flag = 0;
for (int j=i; j<s.length(); j++){
if (tmp.find(s[j]) == string::npos){
tmp += s[j];
flag = 0;
}
else{
i += tmp.find(s[j]);
flag = 1;
break;
}
}
maxlenght = (maxlenght<=tmp.length()) ? tmp.length() : maxlenght;
if (!flag){
return maxlenght;
}
}
return maxlenght;
}
};
利用hash优化的滑动窗口可以优化解答:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int start=0, end = 0, length = 0, size = s.length(), maxlength = 0;
unordered_map<char, int> hash;
char tmp;
while (end < size){
tmp = s[end];
if (hash.find(tmp) != hash.end() && hash[tmp] >= start){
start = hash[s[end]] + 1;
length = end - start;
}
hash[tmp] = end;
end++;
length++;
maxlength = max(length, maxlength);
}
return maxlength;
}
};