给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int res=0,len=0,j=0;
string str="";
for(int i=0;i<s.size();++i)
{
if (str.find(s[i])==-1) //用find()寻找字符串str中是否有重复字符
{
str+=s[i]; //加入字符于str中
}
else //若有则储存最长无重复字符串长度
{
if(len<str.size()) //判断与存储最长无重复字符串的长度
{
len=str.size();
}
if(str[str.size()-1]==s[i])//判断重复位置是否为字符串str最后一位
{
i=i-1; //重新定义i的开始,清空str把s[i]从本位置重新加入str作为起始字符
}
else
{
for(j=0;j<str.size();++j) //判断重复的字符在str中的位置
{
if(str[j]==s[i])
break;
}
i=i-str.size()+j; //重新定义i,找到str重复字符的下一位作为起始字符
}
str=""; //清空str,重新计算最长字符串。
}
// cout<<str.size()<<str<<endl;
}
if(len<str.size()) //最后一个字符不相同时,重新定义最长长度
len=str.size();
return len;
}
};
本题用移动窗口的算法解决,可以用双向队列或者string的方法筛选出重复的字符串长度。