3. 无重复字符的最长子串

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. 无重复字符的最长子串相关的知识,希望对你有一定的参考价值。

目录

1、Question

2、Analysis

3、Code

4、Execution


 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. 无重复字符的最长子串的主要内容,如果未能解决你的问题,请参考以下文章

No.3. 无重复字符的最长子串

3. 无重复字符的最长子串

3. 无重复字符的最长子串

3. 无重复字符的最长子串

Leetcode 3.无重复字符的最长子串(带图)

3. 无重复字符的最长子串