题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
1.暴力解法:
先按照字符串的长度,依次遍历,再对每一个遍历的字符串判断是否有重复字符。判断方法是,使用Set集合。
Java版本:
扫描二维码关注公众号,回复:
12684051 查看本文章
class Solution {
public int lengthOfLongestSubstring(String s) {
int l = s.length();
int ans = 0;
for(int i = 0;i<l;i++){
for(int j = i+1;j<=l;j++){
if (isUnique(s,i,j)){
ans = Math.max(ans,j-i);
}
}
}
return ans;
}
public boolean isUnique(String s, int a, int b){
Set<Character> set = new HashSet<>();
for(int i = a;i <b;i++){
Character ch = s.charAt(i);
if(set.contains(ch)) return false;
set.add(ch);
}
return true;
}
}
运行结果:
但暴力解法,无法通过最后一个很长的用例。
2.滑动窗口解法(参考官网的解题思路)
java版本:
class Solution {
public int lengthOfLongestSubstring(String s) {
int l = s.length();
int ans = 0,i=0,j=0;
Set<Character> set = new HashSet<>();
while(i<l && j<l){
if(!set.contains(s.charAt(j))){
set.add(s.charAt(j++));
ans = Math.max(ans,j-i);
}
else{
set.remove(s.charAt(i++)) ;
}
}
return ans;
}
}
这版代码参考了官网中“滑动窗口(sliding window)”的解法,最值得借鉴的是循环中i和j的处理。
妈妈问我为什么跪着敲代码系列。。。简洁到牛逼。慢慢学吧