给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
具体做法:
- 设备一个begin指针和i指针,都用来向右移动。result记录子串结果。
- used哈希表记录word中用过的字符。
- i首先向右移动。
- 设置一个word变量记录当前的子串。当word中遇到重复时字母时,为当前结果。begin向后移动1格。
- 当剩余的字符数量小于result的size时,结束。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty())
return 0;
//采用双指针思路
int begin=0; //表示滑动窗口的起始点
int i=0; //表示滑动窗口的终点
unordered_map<char,bool> umap; //用于检测是否出现重复
string item; //无重复子串
int cnt=0; //记录长度
for(;begin<s.size();begin++) {
if((s.size()-begin)<cnt) //如果剩余的不够长 就返回
return cnt;
i=begin; //初始化
umap.clear();
item.clear();
while(umap.find(s[i])==umap.end() && i<s.size()) {
umap.insert(make_pair(s[i],true));
item+=s[i];
i++;
} //当未出现重复时
if(item.size()>cnt)
cnt=item.size();
}
return cnt;
}
};