• LeetCode03 最长无重复子串


    题目
    给定一个字符串,找出不含有重复字符的最长子串的长度。
    解答
    刚开始以为只是一遍遍历后来的字符和前面一样便开始算新子串,给的案例都过了,但是卡在了“dvdf”
    后来经过重重试验,暴力循环,不断调整变量作用域,在经过
    “ohvhjdml”
    “bbbbb”
    “abcabcbb”
    “pwwkew”
    “ppkw”
    “ak”
    这几个字符串的测试下,暴力法终于通过了,但是用时较长
    后来又尝试了哈希表缩边界的方法,相对简洁快速

    var lengthOfLongestSubstring = function(s) {
    
    var hash= new hashTable();
    let maxl=0;
    for(let i=0,j=0; j<s.length;j++)
        {
            hash.containsKey(s[j])&& ( i = Math.max(hash.getValue(s[j]),i));  //重复子串,缩小左边界           
             maxl = Math.max(maxl,j-i+1);
            hash.add(s[j],j+1);
        }
        return maxl; 
    };
    
    

    心得:

    1. 在网上查资料的时候发现比较优雅的条件判断,把没有else的if判断改成与或非判断的表达式,简洁优雅还省时间;
    2. 中间卡的时间比较长的就是“dvdf”和“aab”,在用暴力法解答的时候前者我没有考虑“vdf"的情况,字符串被分隔成了“dv”,“df”,后来又加在字符是字符串唯一的时候的条件判断,后者是判断条件不全字符串被分割成了“a”,“a”,“b”,加了第二个字母等于第一个字母时候的特殊条件判断,暴力法就稳了
    3. 换哈希表的时候参考官方的优化边界方法,后来发现不太理解的地方是最后的j+1,试过把j+1和上面的j-i+1的+1删掉。别的测试都没事,但是无重复的子串会少算一个。目前理解是多少个树和中间的坑的问题
  • 相关阅读:
    为什么构造函数不能声明为虚函数,析构函数可以
    _stdcall,_cdecl区别
    C++的dllexport和dllimport
    什么样的代码才是好代码
    苦逼三流小公司程序员这半年找工作经历(3)——选择offer
    c# DataTable、DataSet、DataReader
    C# 定时器
    sql 中如何将返回的记录某一条置顶
    c# devExpress控件 comboBoxEdit,gridControl1,labelcontrol、xtraReports ,ButtonEdit,dateEdit
    c# 公共方法
  • 原文地址:https://www.cnblogs.com/dadaochangcun/p/9821296.html
Copyright © 2020-2023  润新知