题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路:
子串重复问题,可以想到用Set,这题和第五题最长回文子串有点类似,思路都是大循环遍历,然后再内循环找重复。
代码1
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> myset = new HashSet<>();
//最长子串长度max,内循环的指针rk
int rk = 0, max = 0;
for (int i = 0; i < s.length(); ++i) {
//无重复子串,随着i往后走,前面的就不用看了,移出set
if (i != 0) {
myset.remove(s.charAt(i-1));
}
//rk往后走,只要set集合中不含rk,就将它加入到set中
while (rk < s.length() && !myset.contains(s.charAt(rk))) {
myset.add(s.charAt(rk++));
}
max = Math.max(max, myset.size());
}
return max;
}
}
代码2
public int lengthOfLongestSubstring(String s) {
int i = 0, j = 0, max = 0;
Set<Character> set = new HashSet<>();
while (j < s.length()) {
if (!set.contains(s.charAt(j))) {
set.add(s.charAt(j++));
max = Math.max(max, set.size());
} else {
set.remove(s.charAt(i++));
}
}
return max;
}