给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
package com.plat.acoal.leetcode;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class LengthOfLongestsSubstring {
static class Solution {
public int lengthOfLongestSubstring(String s) {
//暴力解法
int n = s.length();
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
if (isUnique(s, i, j)) {
ans = Math.max(ans, j - i);
}
}
}
return ans;
}
//判断字符串是否有重复的
public boolean isUnique(String s, int start, int end) {
Set<Character> set = new HashSet<>();
for (int i = start; i < end; i++) {
Character character = s.charAt(i);
if (set.contains(character))
return false;
set.add(s.charAt(i));
}
return true;
}
}
static class Solution2{
//借用滑动窗口
public int lengthOfLongestSubstring(String s) {
int n=s.length();
Set<Character> set=new HashSet<Character>();
int ans =0,i=0,j=0;
while (i<n&&j<n){
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;
}
}
//优化滑动窗口
static class Solution3{
public int lengthOfLongestString(String s){
int n=s.length();
int ans=0;
Map<Character,Integer> map=new HashMap<Character, Integer>();
for(int j = 0, i = 0; j < n; j++){
if(map.containsKey(s.charAt(j))){
i=Math.max(map.get(s.charAt(j)),i);
}
ans=Math.max(ans,j-i+1);
map.put(s.charAt(j),j+1);
}
return ans;
}
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> window = new HashMap<>();
int left = 0;
int right = 0;
int res = 0;
while (right < s.length()) {
Character c = s.charAt(right);
right++;
window.put(c, window.getOrDefault(c, 0) + 1);
while (window.get(c) > 1) {
Character d = s.charAt(left);
left++;
window.put(d, window.getOrDefault(d, 0) - 1);
}
res = Math.max(res, right - left);
}
return res;
}
}