LeetCode——无重复字符的最长子串
Posted 霜序之晦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——无重复字符的最长子串相关的知识,希望对你有一定的参考价值。
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
分析:这个问题的不变性在于,所求的字符串中每个字符必然是只出现一次,可以借助一个容器来保存字符串中字符出现的次数从而确定是否含有重复字符。
思路:利用两个指针将整个字符串分为三个部分,已经访问过的字符,当前不含重复字符的子串,以及尚未访问的字符。用一个数组来保存当前字符串中所含的字符,从头开始进行循环迭代,并及时更新当前字符串的长度,一旦出现重复,则由头指针开始寻找该重复元素,从当前字符串中截去这一段字符串,即可重新使当前字符串满足不含重复字符这一要求,而且不难看出,头指针必然不会超过尾指针,此即保持上述不变性。结束循环的条件是尾指针到达整个字符串尾,或者当前的最大不含重复字符的子串长度已经大于从当前字符串头指针到整个字符串尾的长度,即不会再出现更长的不含重复字符的子串。
算法的实现如下:
1 int lengthOfLongestSubstring(string s) { 2 int size = s.size(); 3 if (size < 2)return size; 4 vector<int>v(256, 0); //记录当前字符串的字符 5 6 int startIndex = 0; //当前字符串头 7 int endIndex = 0; //当前字符串尾 8 int maxLen = 0; //记录最大长度 9 int Len = 0; //当前字符串长度 10 while (endIndex < size && size - startIndex > maxLen) 11 { //整个字符串尚未访问完 并且 仍有可能出现更长的无重复子串 12 if (v[s[endIndex]] == 1) 13 { //如果当前字符串已经出现过该字符,即出现重复 14 maxLen = Len > maxLen ? Len : maxLen; //如有必要则更新最大长度 15 while (s[startIndex] != s[endIndex]) //找到该重复字符的位置 16 { 17 Len--; //更新当前字符串的长度 18 v[s[startIndex]]--; //更新其间所有字符数量 19 startIndex++; 20 } 21 startIndex++; //新的字符串开头为此重复字符的下一个字符 22 } 23 else 24 { //否则,即当前字符串并不含有该字符 25 v[s[endIndex]]++; //即将该字符的数量加1 26 Len++; //当前字符串的长度加1 27 } 28 endIndex++; //下一个字符 29 } 30 maxLen = Len > maxLen ? Len : maxLen; //如有必要则更新最大长度 31 return maxLen; 32 }
以上是关于LeetCode——无重复字符的最长子串的主要内容,如果未能解决你的问题,请参考以下文章