【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

相关文章

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.