题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:双指针滑动
首先头指针先走(i=1开始)遍历从上个重复字符位置到头指针之间的字符是否有重复,如果有的话更新尾指针(在遇到本次重复之前的字符串最大不重复值已经得出,下次遍历从本次遇到重复的位置开始),并更新不重复子串长度(与当前头指针和尾指针之间距离比较),头指针滑动+1;没有的话,结束遍历,更新不重复子串长度(与当前头指针和尾指针之间距离比较),头指针滑动+1;
题解:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.length()==1)
return 1;
else if(s.length()<1)
return 0;
int count = 0;
int tmp = 0;
for(int i=1; i<s.length(); i++) //遍历尾到头之间的字符
{
for(int j=tmp; j<i; j++)
{
if(s[i]==s[j])
{
tmp = j+1; //更新尾指针,下次遍历从尾指针开始
if(count<i-j)
count = i-j; //更新最大不重复值,即头尾距离
break;
}
}
if(count<i-tmp+1) //如果没有找到相同字符,更新长度即最大不重复值
count = i-tmp+1; //计算距离要包含尾指针
}
return count;
}
};