【LeetCode】4. Longest Substring Without Repeating Characters 最长无重复子串

本文主要是介绍【LeetCode】4. Longest Substring Without Repeating Characters 最长无重复子串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

            Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.


翻译:

           找到最长无重复子串,返回长度。


思路:

          打算在以后的博客中,写上自己的思路、贴上自己的代码的同时,也分析一下别人的思路和写法,毕竟自己的算法不一定是最优的。这道题在最开始做的时候,我的想法非常简单:

          1.若给定字符串为空,返回0(注意边界情况);否则转2。

          2.用tempString来存储无重复子串,maxSize来记录最长无重复子串的长度;

             初始化tempString为给定字符串的第一个字符,maxSize=1;

             从字符串的第2个字符开始,到字符串结束,依次检测每一个字符是否出现在当前无重复子串中:

            (1) 若这个字符在没有出现在当前无重复子串中,将该字符加入到当前无重复子串中;

            (2)若这个字符出现在了当前无重复子串中,

                      比较该无重复子串的长度与maxSize的大小,若该无重复子串的长度大于maxSize,更新maxSize为该无重复子串的长度;

                      更新tempString为字符串中出现当前字符的下一个字符起始到该字符为止的子串(这里说的比较绕口,或不好懂,可以看代码);

          3.待整个字符串都检测完毕后,最后判断一次tempString的长度与maxSize的大小,返回较大的一个。


代码:

public class Solution {public int LengthOfLongestSubstring(string s) {if(s=="")return 0;char[] array=s.ToCharArray();string tempString=array[0].ToString();int maxSize=1;for(int i=1;i<array.Count();i++){int index=tempString.IndexOf(array[i]);if(index!=-1)//若在tempString中存在这个字符{if(tempString.Length>maxSize)maxSize=tempString.Length;tempString=tempString.Substring(index+1)+array[i].ToString();}else//若在tempString中不存在这个字符tempString+=array[i].ToString();}if(tempString.Length>maxSize)return tempString.Length;return maxSize;}
}

         在上面的代码中我应用了额外的空间,包括将字符串转换成字符数组,以及使用tempString来存储当前无重复子串,其实都是不必要的,下面这段代码我使用了C#中的

int string.IndexOf(char value, int startIndex, int count)函数来取代上面代码中应用到的int string.IndexOf(char value)来查找字符串中是否存在某个字符,于是不需要额外将字符串转化成字符数组,也不需要使用一个临时的string变量tempString来存储当前无重复子串。

        我对上面的代码进行了稍微的修改,使用startIndex来记录当前无重复子串的起始位置,count记录当前无重复子串的长度,maxSize仍然记录最长无公共子串的长度。即用startIndex和count两个变量来记录无重复子串在原字符串中的起始位置和长度的方式来记录当前无重复子串,而不是单独使用一个变量。经过这样的改进后,空间上仅需要三个int类型,时间复杂度为O(n),速度大大提升。


改进后的代码:

public class Solution {public int LengthOfLongestSubstring(string s) {if(s=="")return 0;int startIndex=0;int count=1;int maxSize=1;for(int i=1;i<s.Length;i++){int index=s.IndexOf(s[i],startIndex,count);//从字符串的startIndex下标开始,检测长度为count的子串中是否存在s[i],若存在,则返回s[i]在这个字符串中的位置(下标)if(index!=-1)//当前无重复子串中存在这个字符{if(count>maxSize)maxSize=count;startIndex=index+1;//产生新的无重复子串,这个无重复子串从index下一个位置开始,到是s[i]结束count=i-index;//计算新的无重复子串的长度}else//将s[i]加入当前无重复子串中count++;}if(count>maxSize)return count;return maxSize;}
}


         

这篇关于【LeetCode】4. Longest Substring Without Repeating Characters 最长无重复子串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902390

相关文章

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin