LeetCode刷题——3.最长无重复字符的子串

题目来源:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

题目2:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例:

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解法:

一、自己的做法

最开始我的想法是利用多重循环来做,首先利用一个大循环来确定起点,然后使用一个循环来确定终点,在起点与终点中判断利用循环判断是否有重复元素出现,如果有,则count计数必定大于1,此时该起点与终点的字符串一定是含有重复元素的。如果没用重复元素,判断是否为最长字串,若(终点-起点)>maxlen,则更新最长子串长度。最后返回最长子串长度。代码如下:

LeetCode刷题——3.最长无重复字符的子串

但是在测试过程中,总会在计数阶段出现失误,因此换了一种方法,采用hashset集合的方法,由于hashset里面的元素唯一,所以如果将字符数组放入hashset中,长度变短了,则说明有重复元素。

LeetCode刷题——3.最长无重复字符的子串

这个方法确实能够解决元素重复的问题,但是对于传入空字符串""时,需要返回0,无能为力,错误如下:

LeetCode刷题——3.最长无重复字符的子串

之后加入判断条件,发现输入另一个空字符串" "(中间有一个空格),需要返回1,又出错了:

LeetCode刷题——3.最长无重复字符的子串

加入了这样详细的判断条件还是不行:

LeetCode刷题——3.最长无重复字符的子串

二、最后还是选择参考网络上的方法

LeetCode刷题——3.最长无重复字符的子串

该方法较难理解,利用了左边界与右边界的方法,并在计算中不断更新m[s.charAt(i)]的值。

网上还有利用滑动窗口做的,难理解,还需看。