zoukankan      html  css  js  c++  java
  • LeetCode#3

    题目:

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例:

    abcabcbb

    输出的结果应该是3,最长的无重复的字串是'abc'

    果然无论做什么都要静下心来啊!昨晚上卡了一个多小时愣是没改出来,今天仔细的考虑了一下,半个小时搞定…………

    思路:

    简单的滑动窗口问题,遍历字符串,将出现过得字符用map将它的下标存下来。

    当遍历过程中出现map>0的情况,说明出现了重复的字符。此时的i-j(i是窗口右边的指针,j是窗口左边的指针)即是该字串的长度,维护一下答案的最大值。

    注意:

    1. 因为要用map>0判断重复字符是否出现,所以要预先在原来的字符串前边加一个特殊字符,预处理一下,使下标从1开始。

    2. 要处理好字符串最后一个字符的情况

    代码:

    #include <bits/stdc++.h>
    #include <iostream>
    
    using namespace std;
    
    //alkbcdb
    int lengthOfLongestSubstring(string s)
    {
        map<char,int> mp;
        s = "#"+s;
        //cout<<"s: "<<s.length()<<endl;
        int j = 1,ans = 0;
        for(int i=1; i<=s.length(); i++)
        {
            char idx = s[i];
            if(i == s.length()-1)
            {
                if(mp[idx] > 0)
                    ans = max(ans,i-j);
                else
                    ans = max(ans,i-j+1);
            }
            else
            {
                if(mp[idx] > 0)
                {
                    //cout<<"idx: "<<idx<<"  j: "<<j<<" i: "<<i<<endl;
                    ans = max(ans,i-j);
                    while(j <= mp[idx])
                    {
                        mp[s[j++]] = 0;
                    }
                    mp[idx] = i;
                    //cout<<"later j: "<<j<<" and ans: "<<ans<<endl;
                }
                else
                    mp[idx] = i;
            }
    
        }
        return ans;
    }
    
    int main()
    {
        string str;
        while(cin>>str)
        {
            cout<<lengthOfLongestSubstring(str)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    .net Core
    4.1 愚人节
    迷茫了....
    关于Plupload结合上传插件jquery.plupload.queue的使用
    兼容浏览器 回车键 keydown事件
    JS判断是否是IE浏览器的几种方式
    IE IE8 iframe的onload方法分析 IE浏览器onload事件失效
    java 获取请求的完整url地址
    SQLSERVER 数据库基础操作
    java 四舍五入 保留两位小数
  • 原文地址:https://www.cnblogs.com/sykline/p/11588963.html
Copyright © 2011-2022 走看看