力扣第三题,无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

这里我给两种解法,一种是我自己写的,还有一种是题解里的
/**
*思路:一位一位添加入list,如有重复的,则将靠前的重复元素同前面的内容一并删除
* @param s
* @return
*/
public int lengthOfLongestSubstring(String s) {
List<Character> list = new ArrayList<>();//存储当前结果
//处理特殊情况
if (s.length()==0){
return 0;
}else if (s.equals(" ")){
return 1;
}else {
int temp = 0;//记录当前最长子串
for (int i = 0; i < s.length(); i++) {
if (!(list.contains(s.charAt(i)))){
//如list集合中没有当前元素,则添加
list.add(s.charAt(i));
}else {//如果有重复元素
//先将最大长度存入temp
if (list.size()>temp){
temp=list.size();
}
//将靠前的那个重复元素和前面的内容全部删除
int j = list.lastIndexOf(s.charAt(i));
for (int i1 = 0; i1 <= j; i1++) {
list.remove(0);
}
//添加当前元素
list.add(s.charAt(i));
}
}
return list.size()>temp?list.size():temp;
}
}
/**
* 搬运于力扣题解,滑动窗口法
* 使用两个数代表最长子串的左界限和右界限。遇到相同元素则移动左界,右界即为循环指针
* @param s
* @return
*/
public int le(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;//长度
int left = 0;//左界
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){//如果遇到相同元素
left = Math.max(left,map.get(s.charAt(i)) + 1);//将左界移到靠前那个重复元素的后一位
}
map.put(s.charAt(i),i);//将当前元素存入map
max = Math.max(max,i-left+1);//记录当前长度
}
return max;
}
博客探讨了力扣第三题的两种解决方案,分别是自创的双指针法和滑动窗口法。双指针法通过遍历字符串,遇到重复字符时删除靠前的重复元素及其之前的内容;滑动窗口法则利用HashMap记录字符位置,动态调整窗口边界。这两种方法都旨在找到无重复字符的最长子串及其长度。

146

被折叠的 条评论
为什么被折叠?



