题目描述
题目链接:03leeetcode
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路–map集合滑动窗口解法
我们采用java中的map集合来对于给定字符串进行遍历,并记录下给定字符串的值以及下标,不断遍历,如果出现了重复数字,通过map集合中带有的键找值功能去找到对应的下标,将窗口的最左边下标进行更新。
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map = new HashMap<>();
int ans = 0;
int n = s.length();
for (int j =0,i=0;j<n;j++){
if(map.containsKey(s.charAt(j))){
// 更新i
i = Math.max(i,map.get(s.charAt(j))); // 键找值
// System.out.println(i);
}
ans = Math.max(ans,j - i + 1);
map.put(s.charAt(j),j+1);
}
return ans;
}
}
解题思路2–set集合滑动窗口解法
我们可以使用 HashSet 将字符存储在当前窗口 [i,j) 中。 然后我们向右侧滑动索引 j,如果它不在 HashSet 中,我们会继续滑动 ,如果直s[j] 已经存在于 HashSet 中, 我们需要逐个将HashSet中的值remove , 直到将j对应的重复值移出Set,与此同时,索引i右移。这样做的目的是使所有可能存在的没有重复字符的最长子串都以索引i开头,如果我们对所有的i都这样做,就可以得到最后答案.
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> charset = new HashSet<>();
int ans = 0;
int i = 0;
int j = 0;
int n = s.length();
while(i < n && j < n){
if(!charset.contains(s.charAt(j))){
charset.add(s.charAt(j++));
ans = Math.max(ans,j - i);
}else {
charset.remove(s.charAt(i++));
}
}
return ans;
}
}
参考:
https://blog.csdn.net/nailiang97/article/details/97136263