【Leetcode Medium】3. Longest Substring Without Repeating Characters

原题链接

题目描述

找到一个字符串中不出现重复字符的最长字符串并返回该子串长度

解题思路

发现碰到这种问题我的第一反应永远是暴力解法×
固然能完成题目,但效率是真的低下qwq
最暴力的就是O(n²),两个for循环嵌套找子串,比较简单,代码就不贴了

其他解法

法一:滑动窗口

——解决字符串问题&数组问题的常用方法
和暴力解法的基本思想是相同的,使用hashset来模拟滑动窗口找到符合条件的子串
时间复杂度O(n)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int count = 0, begin = 0, end = 0;	//begin和end分别为窗口的开始和结束位置
        Set<Character> slide = new HashSet<>();
        
        while (begin < s.length() && end < s.length()) {
            char tmp = s.charAt(end);
            if (!slide.contains(tmp)) {
                slide.add(tmp);
                count = Math.max(count, slide.size());
                end++;
            }
            else {
                slide.remove(s.charAt(begin));
                begin++;
            }
        }
        return count;
    }
}
法二:优化的滑动窗口

做一个character和index之间的映射(采用hashmap或数组(利用ASCII))
和法一相比,多了一个index信息,滑动窗口的begin不再需要一位一位增加,可以从已有的重复字符的下一个字符开始

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int res = 0, begin = 0;
        Map<Character, Integer> map = new HashMap<>();
        
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(s.charAt(i))) {
                begin = Math.max(begin, map.get(s.charAt(i)));
            }
            res = Math.max(i - begin + 1, res);
            map.put(s.charAt(i), i + 1);
        }
        return res;
    }
}

数组方法同理。
数组和hashmap的区别在于,当数据集的规模与内容,这题中均为字符,可以利用ASCII码来构造数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值