zoukankan      html  css  js  c++  java
  • 无重复字符的最长子串

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int len = s.length();
            // 对于字符串长为0时特殊处理(这里需要这么做,是因为最后答案输出时是ans + 1
            if(len == 0) return 0;
            //头尾下标指针初始化
            int st = 0, en = 0;
            int ans = 0;
            bool ch[128];
            // ch数组按照ASCII码的值记录每个字符是否已被使用
            memset(ch, false, sizeof(ch));
            // 记录第一位的字符
            ch[s[0]] = true;
            // 注意,因为String存储范围的下标其实是 0..(len-1),因此全部处理成en + 1 < len
            while(en + 1 < len)
            {
                // 利用贪心,如果下一位超出String范围,或是已被使用过,则退出循环
                while(en + 1 < len && !ch[s[en + 1]])
                {
                    en ++;
                    ch[s[en]] = true;
                }
                // 由于ans存储的是尾指针-头指针的数值,因此比实际长度小1
                ans = max(ans, en - st);
                // 头指针后移一位
                ch[s[st]] = false;
                st ++;
            }
            // 这里使用ans + 1输出是为了将len = 1的情况一起包括进来,感兴趣的码友可以尝试一下此类数据
            return ans + 1;
        }
    };
    
    作者:iswJXkYVv3
    链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/c-8ms93mb-jian-dan-tan-xin-by-iswjxkyvv3/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    可完整运行的c程序版:

    #include <stdio.h>
    # include <string.h>
    
        int lengthOfLongestSubstring(char *s) {
            int len = strlen(s);
            if(len == 0) return 0;
            int st = 0, en = 0;
            int ans = 0;
            bool ch[128];
            memset(ch, false, sizeof(ch));
            ch[s[0]] = true;
            while(en + 1 < len)
            {   
                while(en + 1 < len && !ch[s[en + 1]])
                {
                    en ++;
                    ch[s[en]] = true;
                }
                 if (ans<en - st) ans=en-st;
                 
                for( ;;st++)
                {
                    
                    if (s[st]==s[en+1])
                    {
                        st=st+1;
                        break;          
                    }
                    else
                    {
                        ch[s[st]]=false;
                        
                    }
                }        
                en=en+1; 
                
    
        }
            return ans+1;
        }
    
    
    int main(void) { 
        char  *msg;
        msg = (char *) "abcbb";
        int len=lengthOfLongestSubstring(msg);
        printf("%d",len);
        return 0;
    }
  • 相关阅读:
    洛谷P1071 潜伏者
    2019BJFU 网站设计(孙俏-web前端开发)实验代码-181002222
    反思——P1307 数字反转
    洛谷P1067 多项式输出
    湖南大学第十五届程序设计竞赛(重现赛)
    2019河北省大学生程序设计竞赛(重现赛)
    2019BJFU C++实验习题(完结)
    配置android source 在ubuntu中编译环境
    Android屏幕保持唤醒状态
    Android richtext
  • 原文地址:https://www.cnblogs.com/saolv/p/12255936.html
Copyright © 2011-2022 走看看