前言
这是力扣的第三道题目,与前两道链表的题目不同,这是一道关于字符串的题目,完成的思路上也有不同,这道题除了使用for循环嵌套的思路进行暴力破解外,我们还可以初步学习到滑动窗口法的使用来提高我们的运算效率,收获到了不一样的知识。
这里使用滑动窗口算法求解。
LeetCode-003- 无重复字符的最长子串
题目描述
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
样例
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"
,所以其长度为 3。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b"
,所以其长度为 1。示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
题目待填函数(C)
int lengthOfLongestSubstring(char* s) {
}
题目分析
题目要求
- 找出不含重复字符的 最长子串 的长度
- 注意是 最长子串 的长度!!!
解题分析
#1-待填函数分析
int lengthOfLongestSubstring(char* s)
函数传入一个字符串 s
函数 int lengthOfLongestSubstring 为 int 型,故要返回一个int变量。
#2- 解题方法分析
滑动窗口算法求解
for循环嵌套暴力求解虽然能够解决该问题,但是时间复杂度过高,在这种问题下我们可以使用滑动窗口算法来优化我们的程序来降低时间复杂度。
下面简单介绍一下滑动窗口算法,作为了解,之后会单独写一篇关于该算法的介绍。
滑动窗口算法(Sliding Window Algorithm)
滑动窗口是一种数据结构和算法的问题解决技术,适用于数组或列表的问题。在O(n²)或O(n³) 中使用蛮力方法可以轻松解决这些问题。然而,滑动窗口技术可以将时间复杂度降低到O(n)。
使用滑动窗口算法的问题的基本特征:
- 基于数组、列表或字符串类型的数据结构
- 问题一般要求在该数组或字符串中查找子范围,必须给出最长、最短或目标值
- 这类问题可以概括为基于一定的条件的最长序列或最短序列。
解决滑动窗口问题的基本步骤:
- 使用外部循环向右增加窗口
- 在外部循环下,使得滑动窗口左侧向右滑动来维持窗口大小。使用这种方式降低循环次数
- 根据问题陈述存储当前的最大或最小窗口大小或计数。
由于输入字符由英文字母、数字、符号和空格组成,我们可以使用一个大小为256的数组来覆盖所有可能的ASCII字符,储存每个字符出现的最后位置。并初始化子串的起始位置start,最长子串的长度。
int last_index[256]; // 存储字符最后出现的位置
int max_length = 0; // 存储最长子串的长度
int start = 0; // 子串的起始位置
初始化这个数组,使所有字符的最后位置为-1
for (int i = 0; i < 256; i++) {
last_index[i] = -1;
}
每遍历到一个字符就更新字符的最后位置
last_index[s[i]] = i;
如果字符已经出现过,则更新子串的起始位置
if (last_index[s[i]] >= start) {
start = last_index[s[i]] + 1;
}
更新最长子串的长度
if (i - start + 1 > max_length) {
max_length = i - start + 1;
}
完整代码示例
int lengthOfLongestSubstring(char *s) {
int last_index[256]; // 存储字符最后出现的位置
int max_length = 0; // 存储最长子串的长度
int start = 0; // 子串的起始位置
// 初始化所有字符的最后位置为 -1
for (int i = 0; i < 256; i++) {
last_index[i] = -1;
}
for (int i = 0; s[i] != '\0'; i++) {
// 如果字符已经出现过,更新子串的起始位置
if (last_index[s[i]] >= start) {
start = last_index[s[i]] + 1;
}
// 更新字符的最后位置
last_index[s[i]] = i;
// 更新最长子串的长度
if (i - start + 1 > max_length) {
max_length = i - start + 1;
}
}
return max_length;
}
欢迎在评论区讨论,指正。