1、【字符串】最长无重复子串:给定一个字符串,找到其中不包含重复字符的最长子串

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值