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

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

时间:2023-03-12 19:22:49浏览次数:34  
标签:子串 字符 charAt map get 更新 最长 left

这是属于滑动窗口的系列题目

public int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        int maxLen = 0;//用于记录最大不重复子串的长度
        int left = 0;//滑动窗口左指针
        for (int i = 0; i < s.length() ; i++)
        {
            /**
            1、首先,判断当前字符是否包含在map中,如果不包含,将该字符添加到map(字符,字符在数组下标),
             此时没有出现重复的字符,左指针不需要变化。此时不重复子串的长度为:i-left+1,与原来的maxLen比较,取最大值;

            2、如果当前字符 ch 包含在 map中,此时有2类情况:
             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后,不管原来的 s.charAt(i) 是否在最长子段中,我们都要将 s.charAt(i) 的位置更新为当前的i,
             因此此时新的 s.charAt(i) 已经进入到 当前最长的子段中!
             */
            if(map.containsKey(s.charAt(i)))
            {
                left = Math.max(left , map.get(s.charAt(i))+1);
            }
            //不管是否更新left,都要更新map中的 s.charAt(i) 的位置!
            map.put(s.charAt(i) , i);
            maxLen = Math.max(maxLen , i-left+1);
        }
        
        return maxLen;
    }

标签:子串,字符,charAt,map,get,更新,最长,left
From: https://www.cnblogs.com/chenyi502/p/17208794.html

相关文章

  • 韩顺平java——常用的换义字符
    Java常用的转义字符1、\t:一个制表位,实现对其功能2、\n:换行符3、\:一个4、\”:一个”5、\’:一个’6、\r:一个回车System.out.println(“韩顺平教育\r北京”);初学java......
  • Java算法——字符串
    344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)......
  • cpp 数字和字符串相互转换
     字符串转数字1、系统函数strtofstrtodstrtold转为浮点数,参数类型是char*strtol转为整数,自动判断字符串进制类型,参数char*stoistofstol参数类型string,整数可......
  • [JS JavaScript] 使用CryptoJS库对给定的加密字符串进行解密
    本代码可以使用在Web中,或者其他可以出入密码的场景在需要解密的信息不大的情况下,可以将加密后的信息放入到JS中,在输入密码后,对加密后的信息进行解密在vue中,可以很方便的......
  • 最长路
    dijkstra不能求带负权最短路我们知道,\(dijkstra\)算法在求最短路是基于贪心思想的:每次选取一个点,这个点到起点的距离一定是最短的(其实就是,\(dijkstra\)很呆,它简单而又......
  • 最长序列
    链接题意给定一个数列,求将其删除任意一段(可以不删)后这个数列的最长上升子串。思路首先考虑到答案必定是一段上升子串或两段之和。而一段可以直接求出,两段还需满足其中......
  • 【PAT乙】1003 我要通过! (20分) 字符串条件判定
    problem“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案......
  • 字符串匹配之KMP算法中的pnext表
    pnext表的分析上篇我们提到了最后是构建一个pnext表,记录着每个字符匹配需要移动的长度的位置信息,接着上篇的内容,我们来分析下pnext表的构造。还是举个栗子:ababcabcacb......
  • 已知列表data中有若干字符串,要求编写程序,对data中的字符串进行过滤,只输出重复字符不超
    data=['abcd','aaa','aabbcc','abc','abccba','aabbccddee']filtered_data=[]forsindata:counts={}forcins:counts[c]=counts.get(c......
  • Java 一行代码判断String字符串是否为纯符号
                 一行代码判断String字符串是否为纯符号 最近项目中新加的需求我感觉我的构思很好,分享给大家原理:1.将String去除前后空格2.将Str......