这是我参与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
};
总结
字符串的处理挺有意思的,在处理字符串的时候要考虑到每种情况所应该对应的处理是什么,一遍遍过自己写的程序,完善可能缺少考虑的情况,最终就会得到想要的结果。
应该还有更简便高效的方法,欢迎大佬们赐教。