题解 | 宝石手串

宝石手串

https://www.nowcoder.com/practice/9648c918da794be28575dd121efa1c50

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <climits>

using namespace std;

int main() {
    int T;
    cin >> T;
    cin.ignore(100, '\n'); // 清空输入缓冲区
    // cout << "T==" << T << endl;
    while (T--) {
        int n; cin>>n;
        cin.ignore(100, '\n'); // 清空输入缓冲区
        // cout << "n==" << n << endl;
        string s; cin>>s;
        cin.ignore(100, '\n'); // 清空输入缓冲区
        // cout << "string==" << s <<endl;
        int ans=-1;
        if (n==2 && s[0]!=s[1]) {
            cout << ans << endl;
            continue;
        }
        for (int i=0; i<n-1; i++) {
            if (i==0 && s[i]==s[n-1])   {ans=0; break;}
            if (s[i]==s[i+1])   {ans=0; break;}
        }
        if (ans==0)   {cout<<0<<endl; continue;}
        // 记录每个属性都有在哪些位置上
        unordered_map<char, vector<int>> positions;
        for (int i=0; i<n; i++) {
            positions[s[i]].emplace_back(i);
        }
        // 计算每个属性不同位置之间的间距
        int min_val = INT_MAX;
        // cout << "position的size=="<<positions.size()<<endl;
        for (auto it=positions.begin(); it!=positions.end(); it++) {
            // cout << "当前position.vector的size=="<<it->second.size()<<endl;
            if ((it->second).size()==1)     {continue;}
            vector<int> temp=it->second, dis;
            for (int i=0; i<it->second.size(); i++) {
                int dis_i;
                if (i==it->second.size()-1) {
                    // cout << "n==" << n << ", temp[0]==" << temp[0] << ", temp[" << i << "]==" << temp[i] << endl;
                    dis_i = (n + temp[0]) - temp[i] - 1;
                }
                else  dis_i = temp[i+1] - temp[i] - 1;
                // cout << "dis_i==" <<dis_i<<endl;
                min_val = min(min_val, dis_i);
                dis.emplace_back(dis_i);
            }
        }
        if (min_val == INT_MAX)  {
            cout << -1 << endl; continue;
        } else {
            // cout<<"min_val==";
            cout<<min_val<<endl; continue;
        }
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

🎓学历背景:末二本+北邮硕想找段日常&nbsp;是简历写的有问题吗&nbsp;目前有家100-499的小厂过了,但大厂现在一个都没面过,官网投递一直在筛简历
牛客44176770...:我也28届,也是投了一个多月,四月底投的,面了6.7场,有个大厂,没结果应该是挂了,有三个小厂面试的很顺利,结果没下文了,互联网我恨你!这五月我时间都在投简历和改简历上了,结果没啥收获,算法也没刷,因为约的面试都没有算法索性就只看项目和八股唉,真的好累啊
我的简历长这样
点赞 评论 收藏
分享
MrGaomq:你沟通的太少了,我两个号沟通了都1w多了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务