LeetCode 3 - 无重复字符的最长子串 - C++含代码

无重复字符的最长子串 - C++含代码

题目(LeetCode 3)
给定一个字符串,请找出其中不含有重复字符的 最长子串 的长度。

示例1
输入: “abcabcbb”
输出: 3

示例2
输入: “bbbbb”
输出: 1

示例3
输入: “pwwkew”
输出: 3


思路
由于题目要求我们查找不含有重复字符的子串中,长度最长的一个。一种直观的想法是,对字符串中所有可能的子串,都检查一遍其中是否含有重复字符,并维护其中符合要求子串的最大长度。这种算法的时间复杂度是 O ( n 3 ) O(n^3) O(n3),其中获取每一个子串的时间复杂度是 O ( n 2 ) O(n^2) O(n2),检查每个子串中是否有重复元素,借助哈希集合的时间复杂度是 O ( n ) O(n) O(n)

时间复杂度高的主要原因在于,我们在遍历的过程中做了许多重复的比较,例如,在检查字符串"abcdeabc"子串"abcdea"和子串"abcdeab"中,分别都要对其中的"c""d"等等进行比较。

回顾上述思路,不难发现,我们没有必要对所有子串进行检查,如果一个子串包含有重复元素,例如"abcdeabc"中的"abcdea"包含有重复字符'a',那么凡是包含该子串的,如"abcdeab",一定有重复字符,对于这些字符串是不需要再进行检查的。更进一步思考,对于一个已知含有重复字符的子串substr,包含它的其他子串的形式一定是...substr......对应在原字符串中子串substr左右的零个或多个字符),这些都是我们不需要考虑的。也就是说,我们需要考虑的是原字符串中间的一段子串,每一次对子串的左右边界移动。这其实就是滑动窗口的思想。

滑动窗口相当于在数组中开了一个可以移动的窗口,窗口内代表我们需要考察的子数组。对于本题而言,窗口内就是无重复字符的子串。因此,我们利用滑动窗口的算法思路是,维护两个变量l

你可能感兴趣的:(leetcode,字符串)