算法刷题-Day06
1. 无重复字符的最长子串
题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
输入示例
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路讲解和代码实现
package com.why.day05;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName:day06
* @Description:todo 无重复字符的最长子串
* @Author: why
* @DateTime:2021/11/3 17:17
*/
public class day06 {
public static void main(String[] args) {
System.out.println(lengthOfLongestSubstring("au"));;
}
/**
* 无重复字符的最长子串
*
* 思路:
* 1. 设置left指针和right指针指向字符串第一个字符
* 2. 移动right指针查看是否与[left,right-1]窗口中的内容重复
* 3. 不重复,窗口长度+1,right后移
* 4. 重复left指针后移,right = left+1
* 5. 直到right指针移动到字符串末尾结束
* @param s
* @return
*/
public static int lengthOfLongestSubstring(String s) {
if (s.equals("")){
return 0;
}
//初始化指针
int left = 0;
int right = 1;
int length = 1;
//创建窗口保存不重复元素
List<Character> window = new ArrayList<>();
window.add(s.charAt(left));
//right指针移动至末尾退出循环
int temp = 1;
while (right < s.length() && left < s.length()){
if (window.contains(s.charAt(right))){ //出现重复
left ++;
right = left + 1;
window.clear();
window.add(s.charAt(left));
length = Math.max(temp, length);
temp = 1;
}else {
window.add(s.charAt(right));
right ++;
temp ++;
}
}
length = Math.max(temp, length);
return length;
}
}