首页 > 其他分享 >leetcode3.无重复字符的最长子串

leetcode3.无重复字符的最长子串

时间:2024-08-18 11:05:46浏览次数:15  
标签:子串 字符 下标 leetcode3 map 重复 get left

题目:

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

思路:

滑动窗口算法。

  • 最大子串长度 = 右下标 - 左下标 +1 ;
  • 使用map记录字符的下标,key 为字符,value 为下标。
    如果 map 的 key 出现重复,说明有重复字符了。
  • 找出左下标 left,如果重复就刷新左下标。

代码:

public class LeetCode3 {

    /**
     *  关键的点:
     *   使用map记录字符的下标,key 为字符,value 为下标。如果 map 的 key 出现重复,说明有重复字符了。
     *   找出left左下标,如果重复就刷新左下标。 map.get(s.charAt(i))+1。
     *   求解长度,可以用右下标减左下标。 i-left+1。
     */
    public int lengthOfSubstring(String s) {
        if (s == null) {
            return 0;
        }
        //Char的泛型是 Character,别写错了
        HashMap<Character, Integer> map = new HashMap<>();
        int max = 0;
        //左边界
        int left = 0;
        for (int i = 0; i < s.length(); i++) {
            //如果出现重复的字符,就刷新滑动窗口的左下标.
            if (map.containsKey(s.charAt(i))) {
                //比较关键的点:
//                1)当前字符包含在当前有效的子段中,如:abca,当我们遍历到第二个a,当前有效最长子段是 abc,我们又遍历到a,
//                那么此时更新 left 为 map.get(a)+1=1,当前有效子段更新为 bca;
//                简单概括,就是 如果有重复元素,把重复的左边的元素移出就行了。
//                2)当前字符不包含在当前最长有效子段中,如:abba,我们先添加a,b进map,此时left=0,我们再添加b,发现map中包含b,
//                而且b包含在最长有效子段中,就是1)的情况,我们更新 left=map.get(b)+1=2,此时子段更新为 b,而且map中仍然包含a,map.get(a)=0;
//                随后,我们遍历到a,发现a包含在map中,且map.get(a)=0,如果我们像1)一样处理,就会发现 left=map.get(a)+1=1,实际上,left此时
//                应该不变,left始终为2,子段变成 ba才对。
//
//                为了处理以上2类情况,我们每次更新left,left=Math.max(left , map.get(ch)+1).
                left = Math.max(left, map.get(s.charAt(i))+1);
            }
            //使用map记录字符的下标
            map.put(s.charAt(i), i);
            //i - left + 1表示非重复子串的长度。i是右边界,left 是左边界。
            max = Math.max(max, i - left + 1);
        }
        return max;

    }


}

参考资料:

https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/

标签:子串,字符,下标,leetcode3,map,重复,get,left
From: https://www.cnblogs.com/expiator/p/18365394

相关文章

  • 代码随想录 day 54 字符串接龙 | 有向图的完全可达性 | 岛屿的周长
    字符串接龙字符串接龙解题思路利用每次更改一次的特性在字典中来找到符合条件的字符串,同时,我们利用set数据结构来筛选该字符串是否被访问过,同时记录到达该字符串所需要的路径长度知识点心得有向图的完全可达性有向图的完全可达性解题思路有向图和无向图的区别在于它的边......
  • 【C语言】字符函数和字符串函数
    文章目录前言一、字符分类函数二、字符转换函数三、字符串函数的分类四、strlen函数的使用五、strcpy和strncpy函数的使用1.strcpy2.strncpy六、strcat和strncat函数的使用1.strcat2.strncat七、strcmp和strncmp函数的使用1.strcmp2.strncmp八、strstr函数的使用九、s......
  • 回调函数,字符函数,字符串函数
    前言:上一趴我们学习了指针。那么今天我们来学习新的知识,回调函数,字符函数,字符串函数。1回调函数什么是回调函数呢?回调函数就是通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。......
  • java String 去掉特殊字符之前的内容
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • Python之字符串例题2道
    实例1:记录成绩实例2:回文实例1:记录成绩将语文数学英语的成绩一次性输入,用空格隔开,例如“899690”利用split()函数可以对字符串以指定的字符进行切割,这里括号内没有指定字符,默认以空格作为切割标志。如score=input().split()会得到一个列表[89,96,90]然后再通......
  • 代码随想录算法训练营day09|151.翻转字符串里的单词,卡码网:55.右旋转字符串,28.实现 str
    151.翻转字符串里的单词题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/暴力removeExtraSpaces:voidremoveExtraSpaces(string&s){for(inti=s.size()-1;i>0;i--){if(s[i]==''&&s[i]=......
  • 实用库/函数之字符数组的使用
    说明:一维字符数组:存放一个字符串(每个数组元素存放一个字符)二维字符数组:存放多个一维数组(字符串);二维数组的行数是字符串的个数。1.初始化(1)单个字符初始化例:charc[10]={'c','','p','r','o','g','r','a','m','\0'};//把10个字符依次......
  • Java String 去掉特殊字符之前的内容方法
    为了去除字符串中某个特殊字符之前(包括该特殊字符本身)的所有内容,我们可以使用Java中的String类的substring和indexOf方法。这里,我将给出一个完整的代码示例,该示例会找到字符串中第一次出现的特定特殊字符(例如#),并删除该字符及其之前的所有内容。1.使用Java中的String类的substring......
  • PTA 7-30 字符串的冒泡排序
    7-30字符串的冒泡排序(20分)我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。输入格式:输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的......