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

这道题我是不会的,然后上网查了一下别人的做法,了解了一下思路,在这里重新打一遍,我用的是js。

思路:找出所有不含重复字符的子串--->找出最大的不重复子串并返回长度



顺道复习一下字符串的操作:

split():把一个字符串分割成字符串数组。split(separator,howmany)

separator必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。

howmany可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

返回值是返回一个字符串数组。

注释:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。


replace():在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。replace(regexp/substr,replacement)

regexp/substr必需。规定子字符串或要替换的模式的 RegExp 对象。

replacement必需。一个字符串值。规定了替换文本或生成替换文本的函数。

返回值是一个新字符串。

注释:每次替换仅能替换一个匹配的而不能多次替换 ,多次替换要于循环搭配。while(str.indexOf('要被替换的字符’) != -1){replace('要被替换的字符’,'要替换成的字符')}.


indexOf():可返回某个指定的字符串值在字符串中首次出现的位置。indexOf(searchvalue,fromindex)

searchvalue必需。规定需检索的字符串值。

fromindex可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的首字符开始检索。

注释:indexOf() 方法对大小写敏感!

注释:如果要检索的字符串值没有出现,则该方法返回 -1。


charAt()返回指定位置的字符。charAt(index)

index必需。表示字符串中某个位置的数字,即字符在字符串中的下标。

str[]同样也可以返回指定位置的字符但两者的不同是当获取的范围超出字符串长度时,charAt()是返回空字符串,而str[]是返回undefined。且str[]不兼容ie6-ie8,而charAt()兼容。


substring()用于提取字符串中介于两个指定下标之间的字符。substring(start,stop)

start必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。

stop可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。

如果省略该参数,那么返回的子串会一直到字符串的结尾。

返回一个新的字符串。

注释:substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。

如果参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。


substr()在字符串中抽取从 start 下标开始的指定数目的字符。substr(start,length)

start必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。

length可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。

返回一个新的字符串


2020.5.4

提交了之后看了人家的做法,感觉更好,这里就搬运过来,感谢瓶子君的整理。(作者:user7746o

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/zi-jie-leetcode3wu-zhong-fu-zi-fu-de-zui-chang-zi-/

维护数组:

解题思路: 使用一个数组来维护滑动窗口

遍历字符串,判断字符是否在滑动窗口数组里

不在则 push 进数组

在则删除滑动窗口数组里相同字符及相同字符前的字符,然后将当前字符 push 进数组

然后将 max 更新为当前最长子串的长度

遍历完,返回 max 即可




解法二:维护下标

解题思路: 使用下标来维护滑动窗口


解法三:优化的Map

解题思路:

使用 map 来存储当前已经遍历过的字符,key 为字符,value 为下标

使用 i 来标记无重复子串开始下标,j 为当前遍历字符下标

遍历字符串,判断当前字符是否已经在 map 中存在,存在则更新无重复子串开始下标 i 为相同字符的下一位置,此时从 i 到 j 为最新的无重复子串,更新 max ,将当前字符与下标放入 map 中

最后,返回 max 即可


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。