lengthOfLongestSubstring

LeetCode 链接 : https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/  

题目: 无重复字符的最长子串

给定一个字符串,找出不含有重复字符的 最长子串 的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列 而不是子串。

  

第一次做只能实现"暴力"解决,时间复杂度是最糟糕的O(n^3).参考社区提供后,学会了时间复杂度的O(n)的解法.


    class Solution {
    public int lengthOfLongestSubstring(String s) {
        //返回值,最长子字符串
        int result = 0 ; 
        //索引号
        int index = 0 ;
        //记录键值对
        Map<Character , Integer> map = new HashMap();
        //两个相同字符之间的距离
        int mark = 0 ;
        //字符串的长度
        int stringLeng = s.length();
        //遍历字符串
        while(stringLeng != index ) 
        {
            //取出每个字符串的字符
            char c = s.charAt(index) ;
            //字符重复出现
            if( map.containsKey( c )) {
                两个相同字符之间的距离
                mark = Math.max(mark , map.get( c ));
            }
            //最长子字符串, "+1"和下一条语句的"++index"是防止字符串s长度为1的情况.
            maxLength =  Math.max(result , index - mark + 1);
            //放入键值对
            map.put(c , ++index);
        }
        return result ;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值