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;
}
原文地址:https://www.cnblogs.com/sykline/p/11588963.html