字符串中不重复连续字符子串的长度最大值

本文介绍了一种求解字符串中最长无重复字符子串长度的高效算法,并提供了详细的实现步骤与示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 森林举行运动会,小伙伴们身上每个都印着一个字符标记,排成一列,委员会要挑出每列里相邻小伙伴身上没有重复字符标记的,最多能挑出几个?
比如:小伙伴们的字符标记串起来是“ccccccbc” 那相邻的小伙伴身上没有重复的字符标记是cb或者bc,那这个人数就是2。

这题的意思是要记录一个字符串中,无重复子字符串的长度的最大值。案例中cb的长度是2,bc的长度也是2所以返回值是2.
要立即对题目的意思再开始做题!!!
此处,用一个map<>存储字符串中<字符,最近一次出现位置>,通过 curStart变量记录最近一个无重复字符串的起始位置。
解答:
public static int lengthOfLongestSubstring(String s) {

     Map<Character, Integer> index = new HashMap<>();  // 存放字符最近一次出现的位置
        int curStart = 0, curLen = 0, maxLen = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);  // 添加字符c到一个已有的无重复字符子串结尾
            if (index.containsKey(c) && index.get(c) >= curStart) { // 字符c已经在这个无重复字符子串中
                curStart = index.get(c) + 1;  // 更新当前无重复字符子串的起点
            }
            curLen = i - curStart + 1;  // 当前无重复字符子串的长度
            if (curLen > maxLen) {
                maxLen = curLen;
            }
            index.put(c, i);
        }
        return maxLen;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值