zoukankan      html  css  js  c++  java
  • Leetcode经典试题:Longest Substring Without Repeating Characters解析

    题目如下:

    Given a string, find the length of the longest substring without repeating characters.

    Example 1:

    Input: "abcabcbb"
    Output: 3 
    Explanation: The answer is "abc", with the length of 3. 
    

    Example 2:

    Input: "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.
    

    Example 3:

    Input: "pwwkew"
    Output: 3
    Explanation: The answer is "wke", with the length of 3. 
                 Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
    https://leetcode.com/problems/longest-substring-without-repeating-characters/

    我学习的优秀代码:
    int lengthOfLongestSubstring(string s) {
            vector<int> dict(256, -1);
            int maxLen = 0, start = -1;
            for (int i = 0; i != s.length(); i++) {
                if (dict[s[i]] > start)
                    start = dict[s[i]];
                dict[s[i]] = i;
                maxLen = max(maxLen, i - start);
            }
            return maxLen;
        }

    来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/discuss/1737/C%2B%2B-code-in-9-lines.

    个人加英文注释版:

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            vector<int> dict(256,-1);//256 is the amount of ASCII and its expanding. use -1 to initialize,dict stores each letter's  index of their last position
            int length=0,start=-1;//initialize
            for(int i=0;i<s.length();i++){// i is the index
                if(dict[s[i]]>start)// it means whether this letter is already contained in the choosed string
                    start=dict[s[i]];// if true, the index of start should be reset to the index of the repeated word
                dict[s[i]]=i;//update the index of their last position
                length=max(length,i-start);//i and start both point at the same letter, so the real length is one letter less,i-start-1+1=i-start
            }
            return length;//return the largest length
        }
    };

    解析如下{

    相关知识点{

    ASCII码与拓展ASCII码{

    ASCII 码使用指定的7 位或8 位二进制数组合来表示128种字符。另外,后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。所以共计256个};

    C++ max与min函数的使用{

    #include<algorithm>//引用头文件

    min(a,b)或者max(a,b}会返回两个数中的较小数或者较大数,通常只用于两个数的大小比较};

    };

    内容解析{

    这个算法最巧妙的地方是使用了哈希表,由于ASCII码的数量很小,只有256个,并且对应规则很明确(指的是字符和整数的对应规则),所以直接开了一个长度为256的数组做哈希表,用来保存这个字符上一次出现时的下标。由于哈希表的使用,查表的时间复杂度变成了O1级,使得速度的提升非常明显!这就是哈希表的力量hhhh

    在if判断正确时,i和start指向的都是同样的字符,所选取的长度应该是要减掉一个的,但是由于尾减去头的结果会比字符个数少一。所以+1和-1相抵。

    其他内容解析见这篇博文:https://www.cnblogs.com/ariel-dreamland/p/8668286.html}

    };

  • 相关阅读:
    csrf跨站请求伪造
    IO 之 InputStream 和 Reader
    javadoc tags
    java this
    递归
    java 文件中 定义一个字符串,它的默认编码是什么?
    合并数组
    << 移位运算
    final static T
    Base64.java 工具类
  • 原文地址:https://www.cnblogs.com/jiading/p/10480876.html
Copyright © 2011-2022 走看看