相同字母的最短距离求解!!!!

题目描述:

给我们一个长度为n的字符串,我们想要知道相同字母之间的最短距离是多少(输出一个最小值即可)。

注:字母只有a~z26个小写字母,每个字符串都保证至少有一对字母相同。

题目输入:

输入第一行为一个整数 n,(字符的个数)。

第二行输入长度为n的字符串。

题目输出:

输出一个整数

#include<bits/stdc++.h>
#define M(a,b) memset(a,b,sizeof a)
#define LL long long
using namespace std;
const int maxn=5000007;
char a[maxn];
stack<char>q;
int n,m;
int main()
{
    while(!q.empty())q.pop();
    scanf("%s %d",a,&m);
    n=strlen(a);
    int cnt=0;
    int flag=n;
    for(int i=0; i<n; i++)
    {
        if(q.empty())q.push(a[i]);
        else
        {
            if(a[i]>q.top())q.push(a[i]);
            else
            {
                while(!q.empty()&&q.top()>a[i])
                {
                    q.pop();
                    cnt++;
                    if(cnt>=n-m)
                    {
                        flag=i;
                        break;
                    }
                }
                q.push(a[i]);
            }
        }
        if(cnt>=n-m)break;
    }
    string ans="";
    for(int i=n-1;i>flag;i--)ans+=a[i];
    while(!q.empty())ans+=q.top(),q.pop();
    reverse(ans.begin(),ans.end());
    ans=ans.substr(0,m);
    cout<<ans<<"\n";
}

真的不会wa求大佬帮我喵喵喵

能给题目自带的测试用例吗

10
abcacbcbad

2

2 个赞

O(n) 做法

for i to n
	get ch
	if a[ch] > 0 //a[ch]表示上一次出现ch的位置 0代表未出现
		update d //d为答案 
	a[ch] = i

已经做出来了,你知道怎么关闭帖子吗