package com.tech.da.rat.string;
import java.util.HashMap;
import java.util.Map;
/**
* 最长无重复子串:给定一个字符串,找到其中不包含重复字符的最长子串。·
*
* @author lw
* @since 2025/6/8
*/
public class Code1_LongNoRepeaterSequenceRunner {
public static void main(String[] args) {
// System.out.println(runLength("abca"));
// System.out.println(runLength("b"));
// System.out.println(runLength("wke"));
System.out.println(runLengthAndPrintText("abca"));
System.out.println(runLengthAndPrintText("b"));
System.out.println(runLengthAndPrintText("wke"));
}
//满足条件的子串最大长度
public static int runLength(String text) {
//基于滑动窗口实现
Map<Character, Integer> map = new HashMap<>(); //存储字符和字符最后出现的位置
int left = 0; //窗口左边界位置
int maxLen = 0; //满足条件的最大子串长度
for (int right = 0; right < text.length(); right++) { //遍历字符
char c = text.charAt(right); //获取遍历的字符
if (map.containsKey(c)) { //假如字符在前面出现过,获取其出现的位置窗口左边界滑动到这个位置
int index = map.get(c);
left = Math.max(left, index + 1);
}
map.put(c, right); //存储字符最后出现的位置
maxLen = Math.max(maxLen, (right - left) + 1); //需要获取子串最大长达,这里取过去的最大长度和左边界滑动后最大长度的最大值
}
return maxLen;
}
//满足条件的子串最大长度且打印该子串
public static int runLengthAndPrintText(String text) {
//基于滑动窗口实现
Map<Character, Integer> map = new HashMap<>(); //存储字符和字符最后出现的位置
int left = 0; //窗口左边界位置
int maxLen = 0; //满足条件的最大子串长度
int maxLenLeft=0; //满足条件的最大子串窗口左边界
int maxLenRight=0; //满足条件的最大子串窗口右边界
for (int right = 0; right < text.length(); right++) { //遍历字符
char c = text.charAt(right); //获取遍历的字符
if (map.containsKey(c)) { //假如字符在前面出现过,获取其出现的位置窗口左边界滑动到这个位置
int index = map.get(c);
left = Math.max(left, index + 1);
}
map.put(c, right); //存储字符最后出现的位置
if(maxLen<(right - left) + 1){ //需要获取子串最大长达,这里取过去的最大长度和左边界滑动后最大长度的最大值,记录最大长度时窗口左右边界
maxLen=right-left+1;
maxLenLeft=left;
maxLenRight=right;
}
}
System.out.println("最大子串:"+text.substring(maxLenLeft,maxLenRight+1));
return maxLen;
}
}