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

无重复字符的最长子串

时间:2024-11-06 14:20:27浏览次数:1  
标签:子串 字符 map int charArray result 最长 left

题目

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

leetcode链接

示例

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

思路

  • 最容易想到是暴力法,每遍历一个字符,就生成一个set,然后往后遍历,看以当前为底的字符最长多少不重复
  • 进阶一点是滑动数组,思想就是保证滑块内的字符都不重复
  • 这里使用一个map保存字符和他的数组位置,使用一个int类型的变量保存滑动数组的左边界,滑动数组的有边界是当前遍历的字符的下标
  • 每遍历一个元素时,看map中是否包含该元素,如果不包含,那么滑动数组左边界不需要修改,直接把该字符和下标放入map中
    • 如果包含,就分情况讨论了,一个是得到这个map中得到的元素的下标在left左边,说明滑动数组已经不包含该元素了,修改map中该字符的下标更新为最新的。
    • 如果map中得到的元素下标在left右边,那么left需要修改为得到的这个下标加一,然后将该map中的元素的下标更新.
    • left = Math.max(left, map.get(charArray[i]) + 1); 就是这段代码,实现了滑动数组的效果
  • 计算子串长度。i - left + 1

代码实现

//滑动数组
public int lengthOfLongestSubstring(String s) {
    int result = 0;
    char[] charArray = s.toCharArray();
    Map<Character, Integer> map = new HashMap<>();
    int left = 0;
    for (int i = 0; i < s.length(); i++) {
        if (map.containsKey(charArray[i])) {
            left = Math.max(left, map.get(charArray[i]) + 1);
        }
        map.put(charArray[i], i);
        result = Math.max(result, i - left + 1);
    }
    return result;
}
//暴力法
public int lengthOfLongestSubstring01(String s) {
    int result = 0;
    char[] charArray = s.toCharArray();
    for (int i = 0; i < charArray.length; i++){
        HashSet<Character> set = new HashSet<>();
        set.add(charArray[i]);
        int temp = 1;
        while ((temp + i < charArray.length) && !set.contains(charArray[i + temp])) {
            set.add(charArray[i + temp]);
            temp++;
        }
        result = Math.max(result, temp);
    }
    return result;
}

标签:子串,字符,map,int,charArray,result,最长,left
From: https://www.cnblogs.com/wwgroup/p/18530138

相关文章

  • python之base64与字符串互相转化
    importbase64defstring_to_base64(input_string:str)->str:"""将字符串转换为Base64编码。参数:input_string(str):要转换的字符串。返回:str:Base64编码后的字符串。"""#将字符串转换为字节byte_data=input_string......
  • 讲解Java字符串
    字符串1.字符串的创建(1)字面量创建(2)使用`new`关键字2.字符串的不可变性3.字符串池(StringPool)4.String类的常用方法(1)`length()`(2)`charAt(intindex)`(3)`substring(intstart)`和`substring(intstart,intend)`(4)`toUpperCase()`和`toLowerC......
  • python转义字符(小白详细解答)
    python转义字符(详细解答)小白初来乍到,请多多关照,如发现文章中有错误请及时提醒,进行修改转义字符是字符串中拥有特殊功能的字符,在字符串中不会显现出来,而是表示特殊功能的字符1.1换行符\n:换行符,将一串字符串进行分割并换行print("1.换行符:""abcd\na1b1c1d1") #1.换......
  • C语言字符数组 java封装
    1.intmain(void){   inta[5]={1,3,5,7,9};   charstrl[5]={'A','B','C','D','E'};   charstr2[5]="ABCD";//不能是ABCDE,最后还有\0   inti=0;   //for(i=0;i<5;i++)   //{ ......
  • # JSON字符串处理 ##
    JSON字符串处理jacksonJackson是一个用于处理JSON数据的Java库,它提供了将Java对象转换为JSON格式和将JSON格式转换为Java对象的功能。添加依赖:如果你使用Maven,可以在pom.xml中添加以下依赖:<dependency><groupId>com.fasterxml.jackson.core</groupId><artif......
  • 关于字符与字符常量的理解
    在C语言中,字符常量和字符变量是不同的概念:1.字符常量字符常量是代码中用单引号括起来的单个字符,表示这个字符的ASCII值。字符常量本质上是一个整数常量,代表该字符的ASCII值或其他编码值(如UTF-8)。示例:charch='A';//'A'是字符常量,其ASCII值为65特点:字符常......
  • 【字节青训营--还原原始字符串(中)】
    问题描述给定一个字符串 F,这个字符串是通过对某个初始字符串 S 执行若干次以下操作得到的:选择一个整数 K(其中 0≤K<∣S∣0≤K<∣S∣,∣S| 表示字符串 S 的长度)将 S 从第 K个位置(从0开始计数)到末尾的子串追加到 S 的末尾,即:S=S+S[K:]输入格式输入为一个字符串 F......
  • ZYB 玩字符串
    Link。Sol好题!我不是DP高手吗,怎么这么简单的DP题没场切。考虑暴力枚举子串,显然最多有\(n\sqrtn\)个,这些子串一定包含答案。对于一个串\(t\)和原串\(s\),考虑\(s\)是否能用\(t\)拼出来。设\(t\)的长度为\(len\)。令\(f_{i,j}\)表示\(i\simj\)最后不能......
  • C++——用指向指针的指针的方法对5个字符串排序并输出。
    没注释的源代码#include<iostream>#include<string.h>usingnamespacestd;voidsort(char**p);intmain(){  constintm=20;  char**p,*pstr[5],str[5][m];  for(inti=0;i<5;i++)    pstr[i]=str[i];  cout<<"pleaseinput5......
  • C++——输入一个字符串,内有数字和非数字字符,如a123x456_ 17960?302tab5876将其中连续
    没注释的源代码#include<iostream>#include<stdio.h>usingnamespacestd;intmain(){  charstr[50],*pstr;  inti,j,k,m,e10,digit,ndigit,a[10],*pa;  cout<<"pleaseinputstring:"<<endl;  gets(str);  pstr=&str[......