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

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

时间:2024-08-15 17:07:43浏览次数:11  
标签:子串 字符 int occ ++ ans 滑动 最长 rk

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

【问题描述】

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

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

【算法设计思想】

此题为典型的滑动窗口问题,这类问题的主要是处理数组或者字符串的子数组或者子字符串问题。滑动窗口算法通过一个动态变化的窗口来解决此类问题。

在这里我将这个问题大体分为以下两类:

1.寻找最长:
步骤一:左右指针(L,R)在起始点,R向右逐位滑动,并更新结果。
步骤二:在每次滑动过程中,如果窗内的元素满足条件,则继续向右滑动,如果不满足条件,则删除左边的元素(即右移左指针)以此来缩小窗口。
步骤三:直到R到达最右端。

2.寻找最短:
步骤一:左右指针(L,R)在起始点,R向右逐位滑动,并更新结果。
步骤二:在每次滑动过程中,如果窗内的元素满足条件,则L向右滑动更新结果,如果不满足条件,则R向右扩大窗口。
步骤三:直到R到达最右端。

在本题的具体解法,则是先初始化一个名为occ的集合,然后用变量n来记录下当前字符串s的长度,记录右指针为rk,ans即为answer的缩写,作为本题所返回的变量。
先写一个for循环,其中循环变量i为左指针,从0到n,然后判断下i的值。while循环主要是看s[rk+1](即rk这个右指针所指向的下一个字符)是不是在occ这个集合中,如果在这个集合中那么就跳出循环,如果不在这个集合中进入循环,加入此字符到occ集合内,然后rk++。
最后返回ans,注意这里在每一次外层循环结束之后会更新ans,即比较ans和occ中字符串的大小,取较大的那个数。

【算法描述】

Python:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        occ = set()
        n = len(s)
        rk = -1
        ans = 0
        for i in range(n):
            if(i != 0):
                occ.remove(s[i-1])
            while rk + 1 < n and s[rk+1] not in occ:
                occ.add(s[rk+1])
                rk = rk + 1
            ans = max(ans,rk-i+1)
        return ans

Java:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        int rk = -1;
        int ans = 0;
        for(int i = 0; i < n; ++i){
            if(i != 0){
                occ.remove(s.charAt(i-1));
            }
            while(rk + 1 < n && !occ.contains(s.charAt(rk+1))){
                occ.add(s.charAt(rk+1));
                ++rk;
            }
            ans = Math.max(ans,rk-i+1);
        }
        return ans;
    }
}

C++:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int rk = -1;
        int ans = 0;
        unordered_set<char> occ;
        int n = s.size();
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                occ.erase(s[i - 1]);
            }
            while(rk + 1 < n && !occ.count(s[rk+1])){
                occ.insert(s[rk + 1]);
                ++rk;
            }

            ans = max(ans,rk-i+1);
        }
        return ans;
    }
};

C语言:

int lengthOfLongestSubstring(char* s) {
    int left = 0;
    int right = 0;
    int max = 0;
    int i, j;
    int len = strlen(s);
    int haveSameChar = 0;
    for (i = 0; i < len; ++i) {
        if (left <= right) {
            haveSameChar = 0;
            for (j = left; j < right; j++) {
                if (s[j] == s[right]) {
                    haveSameChar = 1;
                    break;
                }
            }

            if (haveSameChar) {
                left = j + 1;
            }
        }
        max = (max < (right - left + 1)) ? (right - left + 1) : (max);
        right++;
    }
    return max;
}

l

标签:子串,字符,int,occ,++,ans,滑动,最长,rk
From: https://www.cnblogs.com/zeta186012/p/18361350

相关文章

  • P2679 [NOIP2015 提高组] 子串
    https://www.luogu.com.cn/problem/P2679只能说是,超级好的一道例题[NOIP2015提高组]子串题目背景NOIP2015Day2T2题目描述有两个仅包含小写英文字母的字符串\(A\)和\(B\)。现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符......
  • 0235-RLTK-渲染静态字符
    环境Time2022-11-29WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook/目标渲染一个主窗口,并且在窗口上渲染一些静态的字符。Cargo.toml[package]edition="2021"name="game"version="0.1.0"[dependencies]rl......
  • 【Leetcode 594 】 最长和谐子序列 —— 这是假的滑动窗口吧!
    和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示......
  • 仓颉编程语言:字符串类型(基础数据类型)
    字符串类型使用String表示,用于表达文本数据,由一串Unicode字符组合而成。字符串字面量字符串字面量分为三类:单行字符串字面量,多行字符串字面量,多行原始字符串字面量。单行字符串字面量的内容定义在一对单引号或一对双引号之内,引号中的内容可以是任意数量的(除了非转义的双......
  • C#基础:JSON和字符串、字典、实体类的相互转化方案
    备注:可直接在控制台输出,不需要引用第三方nuget包usingSystem;usingSystem.Collections.Generic;usingSystem.Text.Encodings.Web;usingSystem.Text.Json;classProgram{publicclassData{publicstringMoCategorySelect{get;set;}......
  • 字符串
    byT_Q_X回文自动机(\(PAM\))回文自动机\(PAM\)是一个能够识别一个字符串所有的回文子串的自动机,是一个字符串所有回文子串的信息的高度压缩得到的结果。回文自动机维护了原串上的所有本质不同的回文串。回文自动机的结构可以看成是两棵树,一棵的根是奇根\(odd\),代表着一个长......
  • 字符串后缀相关
    1.后缀数组1.1内容我们将一个字符串\(s\)的所有后缀按照字典序从小到大排序得到数组\(sa\),其中\(sa_i\)表示以\(sa_i\)开始的后缀排名是第\(i\)个。这个数组就叫后缀数组(SuffixArray,SA)。考虑到长度各不相同,所以显然是个排列,设数组\(rk\)是这个数组的逆排列。......
  • 子串查找算法KMP
    什么是子串查找        字符串子串查找是一种在较长的字符串(通常称为"主串"或"文本")中寻找一个较短字符串(称为"模式串"或"子串")的过程。这是计算机科学中的一个基本问题,在文本编辑、信息检索、生物信息学等多个领域都有广泛应用。主要的子串查找算法包括:暴力匹配法(B......
  • LeetCode 3 无重复字符的最长子串
    题目描述给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度......
  • Android-代码混淆及字符串加密
    代码混淆使用ProGuard&R8一些参考链接Android混淆,新引入的D8、R8改变了什么?sdk打包必备,proguard混淆规则如何配置开启混淆app/build.gradle.android.buildTypesrelease{minifyEnabledtrue//开启混淆proguardFilesgetDefaultProguardFile('proguard-and......