题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是子串的长度,“pwke” 是一个子序列,不是子串。
答案(java版):
public class Solution {
public int lengthOfLongestSubstring(String s) {
int res = 0, left = 0, right = 0;
HashSet<Character> hashSet = new HashSet<>();
while (right < s.length()) {
if (!hashSet.contains(s.charAt(right))) {
hashSet.add(s.charAt(right++));
res = Math.max(res, hashSet.size());
} else {
hashSet.remove(s.charAt(left++));
}
}
return res;
}
}
分析:
这道题给了我们一个字符串,求最长的无重复字符的子串,注意这里是子串,不是子序列,所以必须是连续的。这道题类似于第一篇:求两数之和。
解题思路如下:
1,记录之前出现过的字符,记录的方式有很多,选用HashSet是因为Set不保存重复元素,并且查询速度比较快;
2,定义一个滑动窗口,滑动窗口不断右移,并且里面没有重复字符,需要定义一个left变量指向窗口的第一个字符,一个right变量指向当前字符;
3,HashSet中和当前遍历元素重复的元素可能在中间,也可能在两端,需要移动left直到剔除重复元素;
4,定义一个变量res保存最大子串长度,HashSet每次增加一个新元素存储大小都会变化,可能比res大,也可能比res小(剔除过重复元素),所以每次都需要和res比较取最大值。
LeetCode执行结果:通过
执行用时 :13 ms, 在所有 Java 提交中击败了52.45%的用户
内存消耗 :36.5 MB, 在所有 Java 提交中击败了97.35%的用户