首页 > 其他分享 >『LeetCode』3. 无重复字符的最长子串 Longest Substring Without Repeating Characters

『LeetCode』3. 无重复字符的最长子串 Longest Substring Without Repeating Characters

时间:2023-12-22 20:11:24浏览次数:46  
标签:子串 字符 charAt 重复 res 右移 Substring Without Longest

『1』双指针算法

我的想法
一般看到字符串子串问题想到用双指针解,看到字符串子序列问题想到用动态规划解。此题用双指针可以很快解题。

  1. 遍历字符串中的每个字符s.charAt[i], 对于每一个i,找到j使得双指针[j, i]维护的是以s.charAt[i]结尾的无重复字符的最长子串,长度为i - j + 1, 将这一长度与res的较大者更新给res
  1. 对于每一个i,如何确定j的位置:由于[j, i - 1]是前一步得到的无重复字符的最长子串,所以如果[j, i]中有重复元素,一定是s.charAt[i],因此右移j直到s.charAt[i]不重复为止(由于[j, i - 1]已经是前一步的最优解,此时j只可能右移以剔除重复字符s.charAt[i],不可能左移增加字符,因此,j具有单调性、本题可用双指针算法降低复杂度)。
  2. 用数组hash记录字符s.charAt[i]在当前窗口中出现的次数,遍历过程中对于每一个i有四步操作:获取字符s.charAt[i] -> 将s.charAt[i]出现次数hash[s.charAt[i]]加1 -> 若s.charAt[i]重复则右移j(先把s.charAt[j]次数减1,再右移j) -> 确定j及更新当前长度i - j + 1res

实现代码

class Solution {
    // Sliding Window
    // N is the length of s
    // Time Complexity: O(N)
    // Space Complexity: O(1)
    public int lengthOfLongestSubstring(String s) {
        if (s.length() <= 1) return s.length();
        int res = 0;
        int[] hash = new int[127];
        for (int i = 0, j = 0; i < s.length(); i++) {
            hash[s.charAt(i)]++;
            while (hash[s.charAt(i)] > 1) --hash[s.charAt(j++)];
            res = Math.max(res, i - j + 1);
        }
        return res;
    }
}

标签:子串,字符,charAt,重复,res,右移,Substring,Without,Longest
From: https://www.cnblogs.com/torry2022/p/17922297.html

相关文章

  • Spring Security without the WebSecurityConfigurerAdapter
     ENGINEERING | ELEFTHERIASTEIN-KOUSATHANA | FEBRUARY21,2022 | ...InSpringSecurity5.7.0-M2we deprecated the WebSecurityConfigurerAdapter,asweencourageuserstomovetowardsacomponent-basedsecurityconfiguration.Toassistwiththet......
  • 无涯教程-Java - String substring(int beginIndex)函数
    从beginIndex索引处开始截取字符串。Stringsubstring-语法publicStringsubstring(intbeginIndex)这是参数的详细信息-beginIndex  -  包含开始索引。Stringsubstring-返回值指定的子字符串。Stringsubstring-示例importjava.io.*;publicclassTest......
  • 无涯教程-Java - String substring(int beginIndex, int endIndex)函数
    截取beginIndex索引开始到endIndex结束之间的字符串内容。Stringsubstring-语法这是此方法的语法-publicStringsubstring(intbeginIndex,intendIndex)这是参数的详细信息-beginIndex - 包含开始索引。endIndex   - 不包含结束索引。Stringsubstri......
  • sql中的substring()、to_char()、extract()、concat()等函数
    ERROR:functionpg_catalog.substring(timestampwithouttimezone,integer,integer)doesnotexistLINE1:SELECTu.username,l.description,l.ip,SUBSTRING(l.createdate,…^HINT:Nofunctionmatchesthegivennameandargumenttypes.Youmightneedtoadde......
  • Count Beautiful Substrings II
    CountBeautifulSubstringsIIYouaregivenastring s andapositiveinteger k.Let vowels and consonants bethenumberofvowelsandconsonantsinastring.Astringis beautiful if:vowels==consonants.(vowels*consonants)%k==0,inothert......
  • Java字符串分割[split()]和截取[substring()]
    字符串的分割:一般自字符串的分割常用的方法是java.lang包中的String.split()方法,返回是一个字符串数组。语法:publicString[]split(Stringregex,intlimit)参数:regex -- 正则表达式分隔符。limit --分割的份数。比如:需要分割字符串中的每个字符(空格也会被看做字符),split()中......
  • MySQL SUBSTRING() 函数
    语法SUBSTRING(string,start,length)参数值参数必填描述string必需要从中提取的字符串start必需起始位置。可以是正数也可以是负数。如果是正数,此函数从字符串的开头提取。如果是负数,此函数从字符串的末尾提取;字符串索引从1开始length可选要提取的字......
  • 无界鼠标的使用 (mouse without borders)
    下载:https://www.cnblogs.com/dengziqi/p/14613391.html官网https://www.microsoft.com/en-us/download/details.aspx?id=35460 使用:https://www.cnblogs.com/yufeng218/p/16264460.html ......
  • js substring截取字符串,不信你看不懂,简单案例分享
     在JavaScript中,substring 方法用于截取字符串。它返回字符串的一个子集,即原始字符串中介于两个指定下标之间的字符。substring 方法的语法如下:str.substring(indexStart[,indexEnd])indexStart:必需的参数,表示要提取的第一个字符的下标(位置)。如果 indexStart 大于 ind......
  • How to resize slide dimensions without resizing any objects on the slide?
    IFyouarecompetenttounzipthepptxfileandmodifytheXMLitcanbedone,theslidesizewillchangebutthepictureswillnotchange(theywillmovethoughandyouwillhavetoadjustthepositions)Unzip>lookforPPT>presentationXMLandc......