【两次过】Lintcode 384. 最长无重复字符的子串

本文介绍了一种使用滑动窗口法求解给定字符串中最长无重复字符子字符串的问题。通过维护一个频率数组来判断字符是否重复,并利用两个指针进行动态调整,实现了高效的O(n)时间复杂度。

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

 

给定一个字符串,请找出其中无重复字符的最长子字符串。

样例

例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3

对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1

挑战

O(n) 时间

解题思路:

    滑动窗口法。假设现在考察这样一个字串s,从i到j没有重复字母。

    我们为了要找最长的字串,就要j++,查看j+1元素是否与当前字串有重复字母。如果没有则继续j++,直到某一刻j+1的字符与当前字串中产生了重复字母,此时j无法继续向前拓展,记录当前长度,之后i++,直到将这个重复字符刨除出去,j又继续拓展...

    一个问题是:如何判定下一个字符与当前字串是否存在重复字符?可以设置一个数组freq[256],freq[k]中存放的就是ASCII码为k的字符在字串中出现的频率。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] ss = s.toCharArray();
        int res = 0;

        int l = 0, r = -1;
        int[] freq = new int[256];
        while(l < ss.length){
            if(r+1 < ss.length && freq[ss[r+1]] == 0)
                freq[ss[++r]] = 1;
            else
                freq[ss[l++]] = 0;
            
            res = Math.max(res, r - l + 1);
        }

        return res;
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值