在一个字符串中,寻找最长的没有重复的子字符串
class Solution {
public int lengthOfLongestSubstring(String s) {
// 注释部分为复杂度O(n2)的解法
// int res = 0;
// if(s == null || "".equals(s)) return res;
// char[] chars = s.toCharArray();
// Set<Character> set = new HashSet<>();
// for(int i=0;i<chars.length;i++){
// for(int j=i;j<chars.length;j++){
// if(!set.contains(chars[j])){
// set.add(chars[j]);
// }else{
// if(res < set.size()){
// res = set.size();
// }
// set = new HashSet<>();
// break;
// }
// }
// }
// if(res < set.size()){
// res = set.size();
// }
// return res;
// 定义一个map,存储每个字符在字符串中的位置,通过定义两个指针i,j,其中j表示右侧指针
// 当遇到了相同的字符时,就将左侧的i指针移动到最大的相同的字符位置
Map<Character,Integer> map = new HashMap<>();
int res = 0;
for(int i=0,j=0;j<s.length();j++){
if(map.containsKey(s.charAt(j))){
i = Math.max(i,map.get(s.charAt(j)));
}
res = Math.max(res,j-i+1);
map.put(s.charAt(j),j+1);
}
return res;
}
}