糖果(candy)

糖果(candy)糖果(candy)

传送门(损坏

Description

小民是一个很喜欢吃糖果的小孩子,他给所有的糖果进行了分类,有A~Z一共26种糖果,现

在小民有一排糖果,小民很奇怪,吃糖果只喜欢吃连续的若干个,并且不喜欢吃到相同分类

的糖果。现在小民让你帮他计算一下L的最大值,使得他的一排糖果中的任意连续L个糖果都

不会有相同的分类。

Input

输入仅一行,一行由大写字母组成的字符串,代表小民的一排糖果。

Output

输出仅一行,输出L的最大值。如果一排糖果都没有相同的,请输出 -1

Sample Input

ABABABABABAB

Sample Output

2

HINT

【数据范围】 令字符串的长度为 NN 对于 2020 %的数据:1<=N<=1001<=N<=100; 对于 5050 %的数据:1<=N<=10001<=N<=1000; 对于 7070 %的数据:1<=N<=100001<=N<=10000; 对于 100100 %的数据:1<=N<=100000001<=N<=10000000

题目大意

找出一个字符串中字符互不相同的子串的最短长度

思路

时间复杂度 O(s.size)O(s.size)

  • 若找到一个之前没出现过的字符,则记录这个字符出现的时间戳 ii
  • 若找到一个之前出现过的字符 cc ,则用当前时间戳 - 字符 cc 上一次出现的时间戳

ACcodeAC code

#include <bits/stdc++.h>
using namespace std;
string s;
int vis[35];
int ans;
signed main()
{
    cin >> s;
    ans = 0x3f;
    int len = s.length();
    for (int i = 0; i < len; i++)
    {
        if (!vis[s[i] - 'A'])
        {
            vis[s[i] - 'A'] = i;
        }
        else
        {
            ans = min(ans, i - vis[s[i] - 'A']);
            vis[s[i] - 'A'] = i;
        }
    }

    if (ans == 0x3f)
        cout << -1 << endl;
    else
        cout << ans << endl;

    return 0;
}
posted @ 2021-05-08 10:42  蒟蒻orz  阅读(33)  评论(0编辑  收藏  举报  来源