LeetCode算法题解 3-无重复字符的最长子串

题目描述

题解:

我一开始也用的暴力枚举,直接达到O(n3)的复杂度,果然超时。
然后去看的题解才搞懂的:
思路

  1. 设置一个无序集合unordered_set(为什么要无序呢,请继续看下去),初始为空。
  2. 枚举整个字符串,每次都判断当前字符是否已经在集合中存在了
    若不存在(et.find(s[i])) == Set.end()),则表示该子串没有重复元素,那么当前元素可以插入集合中,然后计算一次max_sub。
    若存在(Set.find(s[i])) != Set.end()),则表示该子串中已经存在s[i]了,那么需要做左边开始删除元素,直到删除完重复的元素(为什么不只删除重复的元素,而要把前面的元素都删了呢? 因为当插入s[i]元素后,要保证无重复字符的子串,那么即使前面没有重复元素,也不可能形成无重复子串。)

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll  INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e5+5;

// 方法1:超时
int lengthOfLongestSubstring1(string s) {
    // 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    // 1.枚举出所以的子串
    // 2.求出不含有 重复字符 的最长子串的长度
    int len = s.length();
    int max_len = 0;
    for(int i = 0; i < len; i++)
    {
        for(int j = len-1; j >= i; j--)
        {
            string tmp;
            tmp.assign(s,i,j-i+1);
            sort(tmp.begin(),tmp.end());
            bool flag = true;
            int n = j-i+1;
            for(int k = 0; k < n-1; k++)
            {
                if(tmp[k] == tmp[k+1])
                    flag = false;
            }
            if(flag)
            {
                if(j-i+1 > max_len)
                {
                    max_len = j-i+1;
                }
                break;
            }
        }
    }
    return max_len;
}

int lengthOfLongestSubstring(string s)
{
    if(s.size() == 0)
    {
        return 0;
    }
    int max_sub = 1;
    int left = 0;
    unordered_set  Set;
    for(int i = 0; i < (int)s.size(); i++)
    {
        while(Set.find(s[i])) != Set.end())
        {
            // s[i]在集合中已经存在了(就是说明此时的子串已经有重复元素了)
            Set.erase(s[left++]);
        }
        Set.insert(s[i]);
        max_sub = max(max_sub,i-left+1);
    }
    return max_sub;
}

int main()
{
    /*
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    */

    string s;
    while(cin >> s)// a b c a b c b b
    {
        //cout << lengthOfLongestSubstring(s) << endl;
    }

    return 0;
}

你可能感兴趣的:(#,LeetCode)