无重复字符最长子串(C++)

mac2025-07-10  5

题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 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; } };
最新回复(0)