CSP-M2 B - HRZ 学英语

CSP-M2 B - HRZ 学英语
题目描述 #
瑞神今年大三了,他在寒假学会了英文的26个字母,所以他很兴奋!于是他让他的朋友TT考考他,TT想 到了一个考瑞神的好问题:给定一个字符串,从里面寻找连续的26个大写字母并输出!但是转念一想, 这样太便宜瑞神了,所以他加大了难度:现在给定一个字符串,字符串中包括26个大写字母和特殊字 符’?’,特殊字符’?'可以代表任何一个大写字母。现在TT问你是否存在一个位置连续的且由26个大写字 母组成的子串,在这个子串中每个字母出现且仅出现一次,如果存在,请输出从左侧算起的第一个出现 的符合要求的子串,并且要求,如果有多组解同时符合位置最靠左,则输出字典序最小的那个解!如果 不存在,输出-1! 这下HRZ蒙圈了,他刚学会26个字母,这对他来说太难了,所以他来求助你,请你帮 他解决这个问题,报酬是可以帮你打守望先锋。

说明:字典序 先按照第一个字母,以 A、B、C……Z 的顺序排列;如果第一个字母一样,那么比较第二 个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,SIGH 和 SIGHT),那么把短者排 在前。
例如
上面两种填法,都可以构成26个字母,但是我们要求字典序最小,只能取前者。
注意,题目要求的是 第一个出现的,字典序最小的! 输入格式 # 输入只有一行,一个符合题目描述的字符串。 输出格式 # 输出只有一行,如果存在这样的子串,请输出,否则输出-1 样例输入1 #

AB??EFGHIJKLMNOPQRSTUVWXYZ
 
ABCDEFGHIJKLMNOPQRSTUVWXYZ 
ABDCEFGHIJKLMNOPQRSTUVWXYZ

样例输入1 #

ABC??FGHIJK???OPQR?TUVWXY?

样例输出1 #

ABCDEFGHIJKLMNOPQRSTUVWXYZ

样例输入2 #

AABCDEFGHIJKLMNOPQRSTUVW??M

样例输出2 #

-1

解题思路
利用尺取法
先读入26个字符
判断后将第一个字符去掉并加入下一个心字符在判断
重复至最后一个字符或判断成立
Code

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;
string s;
int ss[100];

int main(){
	cin>>s;
	for(int i=0;i<26;i++){
		ss[s[i]]++;	
	}
	int st=0;
	int e=25;
	int key;
	int co;
	while(1){
		key=0;
		co=0;
		for(int i=65;i<=90;i++){
			if(ss[i]==0){
				co++;
			}
			if(ss[i]>1){
				key=1;
			}
		}
		if(key==1){//no
		    if(e+1==s.length()){cout<<-1;return 0;
			}
			ss[s[st]]--;
			ss[s[e+1]]++;
			st++;
			e++;
		}else{//yes
	        for(int i=st;i<=e;i++){
	        	if(s[i]=='?'){
	        		for(int y=65;y<=90;y++){
	        			if(ss[y]==0){
	        				printf("%c",y);
	        				ss[y]++;
	        				break;
						}
					}
				}else{
					cout<<s[i];
				}
			}
			break;
		}
	}
	cout<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值