糖果(candy)

糖 果 ( c a n d y ) 糖果(candy) (candy)

传送门(损坏

Description

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

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

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

不会有相同的分类。

Input

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

Output

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

Sample Input

ABABABABABAB

Sample Output

2

HINT

【数据范围】
令字符串的长度为 N N N
对于 20 20 20 %的数据: 1 < = N < = 100 1<=N<=100 1<=N<=100
对于 50 50 50 %的数据: 1 < = N < = 1000 1<=N<=1000 1<=N<=1000
对于 70 70 70 %的数据: 1 < = N < = 10000 1<=N<=10000 1<=N<=10000
对于 100 100 100 %的数据: 1 < = N < = 10000000 1<=N<=10000000 1<=N<=10000000

题目大意

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

思路

时间复杂度 O ( s . s i z e ) O(s.size) O(s.size)

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

A C c o d e AC code ACcode

#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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值