zoukankan      html  css  js  c++  java
  • LeetCode 3 Longest Substring Without Repeating Characters

    题目是这样的:Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

    第一遍做题目没理解对,以为是找不重复的字符个数,其实是找最长的不包含重复字符的子串的长度,尝试了数种方法,oj通不过。直接百度了牛人的代码。。。

    网上一个比较好的思路如下

        1:利用一个静态数组a[]来记录各个字符在源字符串中最近一次出现的位置CurrentPos,存放在a[char],这样使用数组用来字符串的处理才是真正灵活的运用了静态数组,默默鄙视一下自认为c学的不错的某人。

        2:接着是有一个子串记数的起点iStart,还有一个string中当前正处理的char元素,利用a[char]查找它上一次出现的位置,这里涉及到如何表示这样一个出现和未出现状态,比较好的办法是初始全部设为-1,这样第一个字符与其实位置做差得到子串的长度存入一个iMax中,这里还涉及到一个如何更新iStart的问题,思路是当a[char]记录的当前char最近一次出现Pos > iStart,则表示当前char在当前子串中出现,需要重新调整这个子串起点iStart,也就是iStart = a[char] ;其实这里使用的当前子串的前一个字符的位置用来记录这个起点的,至于为什么。。。

        3:最长子串的值得更新是通过每次循环计数器i - iStart来计算当前子串长度和前一子串长度iMax比较,然后判断是否更新。

    具体的代码很简洁:

    int lengthOfLongestSubstring(string s) 
                {
                    int iStart = -1;
                    int iPos[256];
                    int iMax = 0;
    
                    memset(iPos, -1, 256 * sizeof(int));
                    for(int i = 0; i != s.size(); ++i)
                    {
                        if(iPos[s[i]] > iStart)
                        {
                            iStart = i;
                        }
                        if(i - iStart > iMax)
                        {
                            iMax = i - iStart;
                        }
                        iPos[s[i]] = i;
                    }
                    return iMax;
                }

    还是做的少,思路不够开阔,这样的题确实锻炼人的思维,以及怎样将直观方法用计算机算法的循环判断逻辑来实现,一句话还得多练。

    感谢网上的牛人孜孜不倦的耕耘博客,造福大家。信息化如此发达,我的学习方式也在渐渐改变,目前是笔记本+纸质书(60%)oj+博客(40%)的比重学习,但是感觉有些收获用博客的形式记录下来,有一个分享的成分,同时方便交流,因为错误记录在笔记本上,很少有人回去翻看,但是记录上互联网媒体上,很可能会有人看到,质疑讨论提高,多有裨益。就写到这,加油学习,才来和Q最总幸福的在一起哈。

  • 相关阅读:
    DS博客作业06--图
    DS博客作业05--树
    DS博客作业04--树大作业说明
    DS博客作业02--栈和队列
    DS博客作业01--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客作业06--结构体&文件
    DEVC怎么建工程
    C语言博客05--指针
    201771010110孔维滢《面向对象程序设计(java)》第十二周学习总结
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4357868.html
Copyright © 2011-2022 走看看