zoukankan      html  css  js  c++  java
  • Oj练习42——T3 Longest Substring Without Repeating Characters

    求一个字符串中不含重复字母的最大子串的长度。

    【思路】

    1.用临时tmp记录长度,遇到重复字母把tmp当前值赋给要返回的length,tmp归零

    比较tmp和length,当tmp>length时,更新length。

    2.每个字母向前遍历是否有重复字母,用哈希表。

    3.反复提交代码不能通过后看了题目tag,知道需要双指针,用一个begin指向重新计数的开始处,i-begin得到当前长度,

    每次遇到重复就把begin赋值为哈希表该字母对应的序号的后一个。

    注意:哈希表还要更新重复字母的序号,否则每次都和第一次出现过的比,begin赋值不正确。

    【my code】

    int lengthOfLongestSubstring(string s) {
            int length=s.size();
            int l=0,tmp=0;
            int begin=0,end=0;
            unordered_map<char,int> charmap;
            for(int i=0; i<length; i++){
                if(charmap.find(s[i])!=charmap.end()){
                    if(l<tmp)
                        l=tmp;
                    tmp=i-begin;//eg:ohomm
                    if(begin<charmap[s[i]]+1)//eg:abba
                        begin=charmap[s[i]]+1;
                }
                charmap[s[i]]=i;
            }
            if(l<tmp) l=tmp;
            return max(l,length-begin);
        }

    【总结】

    一把辛酸泪!

    改了无数遍!最后结果还特别差……哭晕。

    看到一个新解法,新开一个数组,排名十分靠前,明天细细分析。

    【other code】

    int lengthOfLongestSubstring(string s) {
            int locs[256];//保存字符上一次出现的位置
            memset(locs, -1, sizeof(locs));
    
            int idx = -1, max = 0;//idx为当前子串的开始位置-1
            for (int i = 0; i < s.size(); i++)
            {
                if (locs[s[i]] > idx)//如果当前字符出现过,那么当前子串的起始位置为这个字符上一次出现的位置+1
                {
                    idx = locs[s[i]];
                }
    
                if (i - idx > max)
                {
                    max = i - idx;
                }
    
                locs[s[i]] = i;
            }
            return max;
        }

    【分析】

    1.用int数组代替hash表,因为字符的int值不会超过256,所以开一个int locs[256]足够,每次用char的int值做索引。

    2.思路和我修正过后的思路一致,如果当前字符在以前出现过,就把起始位置设为上一次出现的位置,如果没有出现过就记录当前长度,最后不要忘了更新重复出现的字符索引。

    3.哈希表的思路一定要牢记,但不一定非得用unordered类型。

    耗时:22ms,排名最前。

  • 相关阅读:
    数据表格优化
    vue数组和对象的监听变化
    python flask框架搭建以及大佬代码参考
    简单爬虫
    srs的基本配置
    记录飞天程序库调用
    面试题 递归算法1+2+....+100求和
    下载列表组件
    Prometheus之系统安装,启动
    nginx之日志
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4479599.html
Copyright © 2011-2022 走看看