先来回顾一下上期的问题及答案:
「无重复字符的最长子串」(Longest Substring Without Repeating Characters)。
题目描述: 给定一个字符串 s
,请找出其中不含有重复字符的最长子串的长度。
以下是对应的JavaScript实现:
function lengthOfLongestSubstring(s) {const map = new Map();let maxLength = 0;let start = 0;for (let i = 0; i < s.length; i++) {if (map.has(s[i])) {start = Math.max(start, map.get(s[i]) + 1);}map.set(s[i], i);maxLength = Math.max(maxLength, i - start + 1);}return maxLength;
}
解题思路:
使用滑动窗口的思想解决问题。
定义两个指针
start
和i
,分别表示子串的起始位置和结束位置。遍历字符串
s
,对于每个字符,判断其是否在当前子串中出现过。如果字符已经出现过,则更新
start
为该字符上次出现的位置的下一个位置。更新
maxLength
,记录最长的不重复子串的长度。最终返回
maxLength
。
时间复杂度分析:
遍历字符串的时间复杂度为 O(n),其中 n 是字符串的长度。
空间复杂度分析:
使用了一个哈希表
map
来存储字符和其对应的位置,最坏情况下,哈希表的大小与字符串的长度相等,所以空间复杂度为 O(n)。
例如:
console.log(lengthOfLongestSubstring("abcabcbb")); // 3
console.log(lengthOfLongestSubstring("bbbbb")); // 1
console.log(lengthOfLongestSubstring("pwwkew")); // 3
在上述例子中,给定字符串分别为 "abcabcbb"
、"bbbbb"
和 "pwwkew"
。通过调用 lengthOfLongestSubstring
函数找到不含有重复字符的最长子串的长度。最长子串的长度分别为 3
、1
和 3
。
2023年6月7日
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
'.' 匹配任意单个字符。 '*' 匹配零个或多个前面的那一个元素。 所谓匹配,是要涵盖整个字符串 s 的,而不是部分字符串。
上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。