重新排列

重新排列

https://ac.nowcoder.com/acm/problem/211592

题目

牛牛有个很喜欢的字符串 "puleyaknoi"。

牛牛有 T 个很长很长的字符串,他很喜欢把字符串中的子串(连续的某段)打乱,并且按照自己的喜好重新排列。

如果牛牛能把一段重新排列出他喜欢的字符串,他就会把这个子串称作:喜欢的子串。

求出对于每个字符串,最短的喜欢的子串的长度是多少?

如果没有,请输出-1。

解题思路

双指针 + 滑动窗口

如果区间 [i, j] 内的字符串能排列成喜欢的字符串,向右移动 i,否则向右移动 j。

C++代码

#include<iostream>
#include<cstring>
using namespace std;

int like[26] = {0};
int tmp[26]={0};
string str = "puleyaknoi";

inline bool check(){
    for(int i=0; i<26; ++i){
        if(tmp[i]<like[i])
            return false;
    }
    return true;
}

int main(){
    int T;
    string s;
    for(auto c : str){
        int i = c - 'a';
        like[i] += 1;
    }
    cin >> T;
    while(T--){
        cin >> s;
        memset(tmp, 0, sizeof(tmp));
        int ans = -1;
        int i=0, j=0;
        tmp[s[0]-'a'] += 1;
        while(j<s.size()){
            if(check()){
                if(ans == -1)
                    ans = j-i+1;
                else
                    ans = min(ans, j-i+1);
                tmp[s[i]-'a']-=1;
                ++i;
            }
            else{
                ++j;
                if(j==s.size()) break;
                tmp[s[j]-'a']+=1;
            }
        }
        cout << ans << endl;
    }
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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