• 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最总幸福的在一起哈。

  • 相关阅读:
    HDU 3709 数位dp
    Educational Codeforces Round 64 (Rated for Div. 2)-C. Match Points
    POJ 1845乘法逆元+约数和
    POJ3696 欧拉定理
    NC24953 树形dp(最小支配集)
    Codeforces 1173 C 思维+模拟
    Codeforces 1324F 树形dp+换根
    codeforces-1285D(字典树)
    面向纯小白的CLion(C++)基于Windows的安装配置教程
    HDU-2825Wireless Password(AC自动机+状压DP)
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4357868.html
Copyright © 2020-2023  润新知