3.无重复字符的最长子串
一、思路:
(1)暴力法:遍历所有的字串,统计不含有重复字符的字串的最大长度
(2)滑动窗口法:选取(i,j]范围的元素,查看窗口右边的元素,如果元素不在窗口内,j向右移动一个;如果右边的元素在窗口中已经有了重复的值,把i移动到那个重复的值的地方。
二、代码(C++):
int lengthOfLongestSubstring(string s) {
if(s.size()==0) //排除空字符串情况
return 0;
unordered_map<char,int> m; //用一个unordered_map存放元素
int max_length=1; //初始最大长度为1
int i=-1; //初始窗口左端值i为-1
for(int j=0;j!=s.size();j++)
{
if(m.find(s[j])!=m.end()) //元素已经存在在unordered_map,进一步判断,如果m[s[j]]>i则元素在窗口中已经存在
i=max(i,m[s[j]]); //窗口左端移动到已存在的元素处
max_length=max(max_length,j-i); //最大长度等于窗口右端-左端
m[s[j]]=j; //将元素放入unordered_map
}
return max_length; //返回最大值
}