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

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

时间:2025-01-11 17:12:33浏览次数:1  
标签:子串 字符 oneNeedle -- longestStr length let str LeetCode

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

优化用kmp

解题步骤用双指针维护一个滑动窗囗,用来剪切子串。不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位。过程中,记录所有窗口的长度,并返回最大值。

时间复杂度:O(n)空间复杂度:O(m),m是字符串中不重复字符的个数

var lengthOfLongestSubstring = function(s) {
    let str = '';
    let longestStr = '';
    for (let i = 0; i < s.length; i++) {
        if (!str.includes(s[i])) {
            str += s[i];
        } else {
            // Check if the current substring is longer than the longest found so far
            if (str.length > longestStr.length) {
                longestStr = str;
            }
            // Find the position of the repeated character in the current substring
            const repeatIndex = str.indexOf(s[i]);
            // Start a new substring from the next character after the repeated one
            str = str.substring(repeatIndex + 1) + s[i];
        }
    }
    // Final check to update the longest substring if needed
    if (str.length > longestStr.length) {
        longestStr = str;
    }
    console.log(longestStr);
    return longestStr.length;
};
console.log(lengthOfLongestSubstring('pwfwkew'))
//只能用 string 和数组  time O(n*n)  space O(n)

//Map Solution time O(n)  space O(m)
var lengthOfLongestSubstring = function(s) {
    let oneNeedle=0
    let twoNeedle=0
    let map=new Map()
    for(let i=0;i<s.length;i++){
        if(map.has(s[i])&&map.get(s[i])>=oneNeedle){
            oneNeedle=map.get(s[i])+1
        }
        twoNeedle=Math.max(twoNeedle,i-oneNeedle+1)
        map.set(s[i],i)
    }
    return twoNeedle
};
console.log(lengthOfLongestSubstring('pwfwkew'))

flowchart TD A[开始] --> B{是否遍历结束} B -->|No| C[获取当前字符] C --> D{字符是否存在于 map 且位置 >= oneNeedle} D -->|Yes| E[更新 oneNeedle] D -->|No| F[跳过更新 oneNeedle] E --> G[更新最大长度] F --> G G --> H[更新 map] H --> B B -->|Yes| I[返回最大长度]

'

标签:子串,字符,oneNeedle,--,longestStr,length,let,str,LeetCode
From: https://www.cnblogs.com/KooTeam/p/18665872

相关文章

  • 字符串解码(递归)
    题目链接:https://leetcode.cn/problems/decode-string/题意:嵌套递归classSolution{public:intwhere;stringrepeat(stringpath,intcnt){stringans="";for(inti=1;i<=cnt;i++){ans+=path;......
  • 【Leetcode 热题 100】739. 每日温度
    问题背景给定一个整数数组tempera......
  • 【Leetcode 每日一题】3270. 求出数字答案
    问题背景给你三个正整数num1num_1num1​,......
  • Leetcode刷题的一些记录(Java)
    Leetcode刷题一、理论:1.数组:https://programmercarl.com/数组理论基础.htmlC++中二维数组在地址空间上是连续的。像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机。所以看不到每个元素的地址情况,这里我以Java为例,也做一个实验。publicstatic......
  • LeetCode:349.两个数组的交集
    集合是什么?一种无序且唯一的数据结构。ES6中有集合,名为Set。集合的常用操作:去重、判断某元素是否在集合中、求交集letarr=[1,2,2,4,5,6,7,8,9,10]letunRepeat=[...newSet(arr)]console.log(unRepeat)letset1=newSet([1,2,3])letset2=newSet([3,4,5])console.log(se......
  • C语言实现字符串替换函数
    #include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>//字符串替换函数/*********************************************************************Function:my_strstr()*Description:在一个字符串中查找一个子串;*Input:p......
  • LeetCode:141.环形链表
    //双指针快+1=慢trueclassListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}varhasCycle=function(head){letfast=headletslow=headwhile(......
  • LeetCode:83.删除排序链表中的重复元素
    LeetCode:83.删除排序链表中的重复元素classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}vardeleteDuplicates=function(head){letp=head//head......
  • 二叉树层序遍历 Leetcode102.二叉树的层序遍历
    二叉树的层序遍历相当于图论的广度优先搜索,用队列来实现(二叉树的递归遍历相当于图论的深度优先搜索)102.二叉树的层序遍历给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[......
  • 总结并拆解所有新手常用的——String API(二)(字符串)
    前言:String类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写.......小编这次就比较全面系统的带大家总结清楚几乎所有string常用的API,并且带大家拆解清楚,能够灵活使用!!!小编最近熬夜牙疼的......