题解 | 最长不含重复字符的子字符串

最长不含重复字符的子字符串

https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7

import java.util.*;


public class Solution {
    // 找到字符串中最长的不包含重复字符的子字符串,返回最长子字符串的长度
    // 思路:双指针遍历字符串,最后返回两个指针的差值就是最长字符串的长度
    // 关键词:最长,不含重复字符
    // 最长要靠双指针,重复字符要靠哈希表
  	// 在这段代码中,没有用到双指针,只用了一个指针回溯来遍历整个字符串,通过哈希表本身不含重复元素的性质,key为字符,value为该字符对应的index;当遇到重复的字符,就找到对应字符在当前记录的子字符串的位置,之后将该位置之前的所有字符remove。之后有一个关键点在于,当把重复位置(含重复位置)之前的字符remove后,之后的几个字符可能也已经添加到哈希表中了,我们需要通过改变right的值来将其定位到没有被遍历过的新字符的位置上,通过right = index + hashMap.size()实现。
    public int lengthOfLongestSubstring (String s) {
        if(s.length() == 1) return 1;
        // write code here
        // 指针需要回溯
        int right = 0;
        HashMap<Character,Integer> hashmap = new HashMap<>();
        // 每次比较max和当前遍历到的字符串的长度
        int max = Integer.MIN_VALUE;
        while(right < s.length()){
            if(!hashmap.containsKey(s.charAt(right))){
                // 这里记录每次加进来的字符的key和对应位置的value
                hashmap.put(s.charAt(right),right);
                max = Math.max(max,hashmap.size());
                right++;
            }else{
                // 遇到重复的字符,就找到对应字符在当前记录的子字符串的位置,之后将该位置之前的所有字符remove
                max = Math.max(max,hashmap.size());
                int index = hashmap.get(s.charAt(right));
                for(int i = index;i>=0;i--){
                    hashmap.remove(s.charAt(i));
                }
                right = index + 1 + hashmap.size();

            }
        }
        return max;
    }
}

全部评论

相关推荐

爱读书的放鸽子能手很...:刷个两端实习,冲春招,流水线什么时候不能去
我的秋招日记
点赞 评论 收藏
分享
09-01 11:31
门头沟学院 Java
buul:七牛云的吧,感觉想法是好的,但是大家没那么多时间弄他这个啊。。。不知道的还以为他是顶尖大厂呢还搞比赛抢hc,只能说应试者的痛苦考察方是无法理解的,他们只会想一出是一出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务