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

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

时间:2023-11-07 20:03:01浏览次数:32  
标签:子串 字符 last charAt int res 最长 指针

题目概述:给定一个字符串s,求该字符串中无重复字符的子串的最长长度
解题思路:用一个哈希表来记录每个字符最近出现的位置。指针i遍历s,并用另一个指针j从当前位置的下一个位置开始遍历,每次检查当前枚举的字符上一次出现的位置pos是否>=i,如果>=i,说明当前子串中出现重复字符,更新答案,指针i直接跳到该位置即pos处,哈希表清空,指针j继续从i的下一个位置开始遍历;如果pos<i,说明该字串中还没出现重复字符,长度加1,更新哈希表。
时间复杂度:\(O(n^2)\),竟然过了,数据挺水的
代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        //record the last position that appear
        Map<Character,Integer>last = new HashMap<>();
        int res = 0;
        for(int i = 0; i < s.length(); i ++){
            int len = 1;
            last.put(s.charAt(i),i);
            for(int j = i + 1; j < s.length(); j ++){
                int pos = last.getOrDefault(s.charAt(j),-1);
                if(pos >= i){
                    i = pos;
                    //last.put(s.charAt(j),j);
                    res = Math.max(res,len);
                    last.clear();
                    break;
                }else{
                    len++;
                    last.put(s.charAt(j),j);
                }
            }
            res = Math.max(res,len);
        }

        return res;
    }
}

正解:在上述暴力做法中,当遇到含重复字符的子串时。我们让指针i回到该字符上一次出现的位置,并且让j指针从该位置的下一个下一个位置开始枚举。但其实我们可以发现j指针又会重复枚举那段不包含重复字符的串,因此我们可以让j不向回走。i指针每次向右移动一个单位,j指针一直移动到其能到达的最右端(不出现重复字符)。类似一个滑动窗口,期间需要一个哈希表来维护出现的字符,j指针移动时向其中加入字符,i指针移动时,需要删除字符
时间复杂度:\(O(n)\)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        Set<Character>set = new HashSet<>();
        int res = 0;
        int r = -1;

        for(int l = 0; l < n; l ++){
            if(l != 0){
                set.remove(s.charAt(l - 1));
            }

            while(r + 1 < n && !set.contains(s.charAt(r + 1))){
                r++;
                set.add(s.charAt(r));
            }

            res = Math.max(res,r - l + 1);
        }

        return res;
    }
}

标签:子串,字符,last,charAt,int,res,最长,指针
From: https://www.cnblogs.com/dengch/p/17815783.html

相关文章

  • java代码中拼接的长字符有么又快速去掉+好的方法?
    在Java中,拼接长字符时使用+运算符会导致性能下降,因为每次拼接都会创建一个新的字符串对象。为了提高性能,可以使用StringBuilder或StringBuffer类来代替+运算符。这两个类都提供了操作字符串的方法,并且在拼接长字符时效率更高,因为它们是可变的。示例代码如下:StringBuilder......
  • golang中 String bytes rune 和 字符概念与应用
    一、引入问题-为何打印s[0]没有打印‘你’字符packagemainimport"fmt"funcmain(){ s:="你" fmt.Println(s[0]) fmt.Printf("%s\n",s[0])}output%!s(uint8=228)首先需要知道go中编码格式和String类型,Go内置的utf-8编码格式。二、utf-8编码与Unicode......
  • leet code 5. 最长回文子串
    5.最长回文子串题目描述给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s仅由数字和英文......
  • 常用数学符号大全 特殊字符 特殊符号
    1、几何符号⊥  ∥  ∠  ⌒  ⊙  ≡  ≌   △ ⊆ ⊇ Δ Λ Σ ∅ ⋅ ◊ ο ◦2、代数符号∝  ∧  ∨  ~  ∫  ≠   ≤  ≥  ≈  ∞  ∶3、运算符号如加号(+),减号(-),乘号(×或·),除号(÷或/),两个......
  • js 拼接字符串带变量(js方法参数单双引号拼接的问题记录)
    小结:外面单引号,里面双引号,然后方法参数给转义的单引号即可(看下面的onClick事件即可)//刷新二级信号表格(增删改操作后)functionreloadSignal(subId){//清空$("#msgAll"+subId).empty();//js手工添加表格varhtmlStart='<spanstyle="posit......
  • oracle函数大全-字符串处理函数
    字符函数——返回字符值这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如:VARCHAR2数值被限制为2000字符(ORACLE8中为4000字符),......
  • Matlab命令集--常用字符串函数
    Matlab命令集--常用字符串函数常用函数eval :运行字符串表示的表达式char :将数组变成字符串double:将数字字符串变成数字字符串操作deblank:去掉字符串末尾的空格findstr:查找字符串lower  :转换为小写strcat :字符串连接组合strcmp :字符串比较strcmpi:字符串比较(......
  • [HTML]特殊字符
    https://www.runoob.com/html/html-entities.html 显示结果描述实体名称实体编号 空格&nbsp;&#160;<小于号<&#60;>大于号>&#62;&和号&amp;&#38;"引号"&#34;'撇号 &apos;(IE不支持)&#39;¢分&......
  • 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为
    一个报表的查询,用ajax调用的Service,查询条件没有问题,后台也能返回数据,就一直返回Error提示,F12看到是因为返回json时出错了 在web.config的configuration加以下代码即可解决<system.web.extensions><scripting><webServices><jsonSerializationmaxJs......
  • java base64字符串转换为图片
    javabase64字符串转换为图片实现步骤:base64字符串长这样'"data:image/png;base64,iVBORw0KGgoAAAAN(中间省略好多字符串)AAAABJRU5ErkJggg=='方法一:首先,图片本质上是一种二进制文件,所以创建一张图片,就是创建一个文件,里面写入二进制的数据。#参数avatar接收base64字符串#1......