3. 无重复字符的最长子串
Posted 我要出家当道士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. 无重复字符的最长子串相关的知识,希望对你有一定的参考价值。
目录
1、Question
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。示例 4:
输入: s = "" 输出: 0提示:
0 <= s.length <= 5 * 10^4
s
由英文字母、数字、符号和空格组成来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、Analysis
有两种方法。
一种就是常规的比较,变量 i 表示子串在 s 中的起始位置,变量 j 表示子串在 s 中的结束位置,通过比较确保 s[i:j]为不存在重复字符的子串,并通过比较求出最长子串的长度。
第二种参考率官网的解法,名为滑动窗口。与第一种方法思路类似,但不同在于 j 的位置不用每次重复确定。如果 s[i:j] 里面都是不重复的字符,那么向右移动 j (自增),一直移动到子串出现重复字符;如果出现重复,则向右移动 i,一直移动到子串中不存在重复字符。
剩下的一个问题就是如何判断子串中是否存在重复字符,官网提供的思路是使用map。由于我用的是C,不是很方便。其实可以定义一个长度为256(char一个字节)的数组,也可以实现快速查找,字符的 Ascall 码就代表其数组下标(空间换时间)。
以上两种方法都可以AC,第二种效率更高。
3、Code
第一种
int lengthOfLongestSubstring(char * s){
int maxLen = 0, strLen = strlen(s);
for (int i = 0; i < strLen; i++)
{
int word[256] = {0};
int len = 0;
for (int j = i; j < strLen; j++)
{
if (word[s[j]]) break;
len++;
word[s[j]] = 1;
}
if (maxLen < len) maxLen = len;
}
return maxLen;
}
第二种
int lengthOfLongestSubstring(char * s){
int maxLen = 0, strLen = strlen(s);
int word[256] = {0};
int i = 0, j = 0;
for (i = 0; i < strLen; i++)
{
if (i > 0) word[s[i-1]] = 0;
for (; j < strLen; j++)
{
if (word[s[j]]) break;
word[s[j]] = 1;
}
if (maxLen < (j - i)) maxLen = j - i;
}
return maxLen;
}
4、Execution
第一种
第二种
以上是关于3. 无重复字符的最长子串的主要内容,如果未能解决你的问题,请参考以下文章