LeetCode无重复字符的最长子串|8月更文挑战

307 阅读2分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

前言

字符串处理在前端或者后端都有着举足轻重的地位,处理好字符串是我们每个人都必须掌握的技能,下面来一道简单的字符串相关的算法题。

LeetCode 无重复字符的最长子串

题目描述

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

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为3。

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是"b",所以其长度为1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。   请注意,你的答案必须是子串的长度,"pwke"是一个子序列,不是子串。

示例 4:

输入: s = ""

输出: 0

解题思路

  • 首先声明两个数组,一个noRepeat为空,用来存放不重复的字符,一个sArray用来存放通过split转换的字符串
  • 通过forEach对sArray数组中的每一项进行判断(通过noRepeat.includes(item)来判断noRepeat中是否存在此时的item)
  • 如果判断结果为false,就存入数组noRepeat
  • 如果判断结果为true,首先判断maxLength和noRepeat.length的大小,如果maxLength<noRepeat.length就把noRepeat的长度赋值个最大值maxLength,并且通过indexOf来判断此item在noRepeat数组中的位置,通过slice删除找出位置下边之前的项,包括所找出的下标项,并把此item存入noRepeat,直至循环结束
  • 记得在最后再进行一次maxLength和noRepeat.length的判断(因为有可能从某时刻开始没进过else,或者极端的说可能一开始就没进去过else,也就是没有重复项的情况)
  • 最后return出maxLength即所求结果
  • 记得考虑输入是空的情况

代码如下:

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    var sArray = s.split('')
    var  noRepeat = []
    var  maxLength =0 
    sArray.forEach((item,index) => {
        if(!noRepeat.includes(item)){
           noRepeat.push(item)
        }else{
            if(maxLength<noRepeat.length){
                maxLength= noRepeat.length
            }
            var index = noRepeat.indexOf(item)
            noRepeat =noRepeat.slice(index+1)
            noRepeat.push(item)
        }
    })
    if(maxLength<noRepeat.length){
                maxLength= noRepeat.length
            }
    return maxLength
};

总结

字符串的处理挺有意思的,在处理字符串的时候要考虑到每种情况所应该对应的处理是什么,一遍遍过自己写的程序,完善可能缺少考虑的情况,最终就会得到想要的结果。

应该还有更简便高效的方法,欢迎大佬们赐教。