【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

相关文章

哈希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

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &