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

输入格式
输入只有一行,一个符合题目描述的字符串。

输出格式
输出只有一行,如果存在这样的子串,请输出,否则输出-1

输入样例1

ABC??FGHIJK???OPQR?TUVWXY?

输出样例1

ABCDEFGHIJKLMNOPQRSTUVWXYZ

输入样例2

AABCDEFGHIJKLMNOPQRSTUVW??M

输出样例2

-1


解题思路
这道题的目的就是,输出第一个符合要求的子串,符合什么要求呢?

  • 这个子串的长度为26
  • 这个子串中要出现每个大写英文字母
  • 这个子串中如果有癞子的话,需要按照字典序最小输出,如样例1所示

那么怎么获取这样的子串呢?
从前往后遍历这个字符串的每一个字符所接的长度为26的子串?不可取。

这里的思路是:尺取法

首先划两个int变量,作为这把“尺子”的两端,初始化均为0。
每次循环,把右端往右挪一位,此举可以增大尺子的长度。
如果当前的尺子内容不满足题目要求,就继续挪右端。
如果当前的尺子内容满足了题目要求,那么如果其中有问号符(即癞子),就把这些问号符转化成让这个子串的字典序最小的情况即可,然后输出。
如果当前的尺子内容不满足题目要求且长度大于了26,那么就把左端也挪一位。

详细过程看代码:
(如果题目要求改为“整个字符串中符合要求的子串中字典序最小的”,那么只需要修改一下获取ans的那几行代码即可)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <cstring>using namespace std;string input;
string ans;int hasIn[26];//为1时表示对应字母在动态队列中
int pos[26];//对应字母的位置,为-1时说明不在队列中
int black;//癞子
int newhasIn[26];//临时hasInint CtoI(char x)
{if (x == '?') return 100;//?映射为100,即癞子else return (x - 65);//A映射为0,Z映射为25
}int main()
{cin >> input;if (input.length() < 26){cout << -1 << endl;return 0;}bool isOK = false;memset(hasIn, 0, sizeof hasIn);memset(pos, -1, sizeof pos);int left, right;//动态队列的左右指针left = right = 0;black = 0;if (CtoI(input[0]) == 100){black++;}else{hasIn[CtoI(input[0])] = 1;pos[CtoI(input[0])] = 0;}while (right < input.length()){right++;int cur = CtoI(input[right]);if (cur == 100){black++;}else{if (hasIn[cur]){//弹出左侧的int temp = pos[cur];for (int i = left; i <= pos[cur]; i++)//i表示位置{int cur_t = CtoI(input[i]);//cur_t表示i处的那个字母if (cur_t == 100){black--;}else{hasIn[cur_t] = 0;pos[cur_t] = -1;}}left = temp + 1;}hasIn[cur] = 1;pos[cur] = right;}if ((right - left) == 25){string newstr = input.substr(left, 26);if (black > 0)//如果有癞子{for (int i = 0; i <= 25; i++){newhasIn[i] = hasIn[i];}for (int i = 0; i <= 25; i++){if (newstr[i] == '?'){for (int j = 0; j <= 25; j++){if (newhasIn[j] == 0){newhasIn[j] = 1;newstr[i] = j + 65;break;}}}}}if (newstr.length() == 26){ans = newstr;isOK = true;break;}left++;}}if (!isOK) cout << "-1" << endl;else cout << ans << endl;return 0;}

Competition2:HRZ学英语相关推荐

  1. 程序设计思维(CSP模拟题)B - HRZ 学英语

    题目 瑞神今年大三了,他在寒假学会了英文的26个字母,所以他很兴奋! 于是他让他的朋友TT考考他,TT想到了一个考瑞神的好问题:给定一个字符串,从里面寻找 连续的26个大写字母 并输出! 但是转念一想 ...

  2. SDU程序设计思维实践题目总结

    题目来源及链接 题目名称及讲解博客链接 涉及算法 原题以及原题链接 第二周作业 Maze BFS POJ-3984 Pour water BFS POJ-1606 第二周实验 化学 模拟 codefo ...

  3. 程序设计思维与实践 CSP-M2 (3/4/数据班)

    HRZ的序列 题意: 相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列a,他对这个序列产生了浓厚的兴趣. 他好奇是否存在一个数K,使得一些数加上K,一些数减去K,一 ...

  4. 程序设计思维与实践 CSP-M2

    HRZ的序列 相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列a,他对这个序列产生了浓厚的兴趣,他好奇是否存在一个数K,使得一些数加上K,一些数减去K,一些数不变, ...

  5. 程序员注意了:这个微信群可以学英语,而且全程免费

    不少同学问我,有没有免费学英语的地方. 不瞒大家,我还真知道. 今天分享的是一个微信群,群里面会有免费的英语课程,还有专业的英语老师辅导学习. 不过,这个微信群说是严格把控微信群学习质量,所以一个群限 ...

  6. 文末福利 | 只送给真正想学英语的你!

    打开电脑,我内心充满了紧张和期待,我又一次要特立独行的搞出点儿轰动大事情! 我打算邀请你和我一起"共谋大事","重金"邀请你: 花别人三分之一的时间学好英语 用 ...

  7. 宏基因组 微生物人注意了!这个微信群可以学英语,而且全程免费

    最近不少网友发现,在微信群里居然可以学英语!而且全程免费! 群里面会有免费的英语直播课,免费的课程资料,还有专业的英语老师辅导学习. 更重要的是,不需要集赞,转发,分享,就可以加入! 但是,群主要求免 ...

  8. “单词不用背,看完自然会”,4天背过1万单词,原来学英语真的有捷径!

    前天,Coco突然找到我,说要请我吃饭. 我准备辞职了,上周我成功通过500强的英语面试,拿到了运营推广经理的Offer,工资是现在的6倍! 没有您教我学英语,我不可能在3个月内提升得这么快. 估计现 ...

  9. 造句简单_零基础也能说一口流利英语,用简单的you are造句学英语

    万能公式学英语 学习10分钟,相当于跟别人学习10个小时 学习主题 零基础也能说一口流利英语, 用简单的"you are+..." 造出简单又地道的英语句子吧! 句子拓展You a ...

  10. 学英语必备的18条法则,建议收藏!

    黄金法则第1条 What is language for? Some people seem to think it is for practicing grammar rules and learn ...

最新文章

  1. 各种 AI 数据增强方法,都在这儿了
  2. 【python初识】数据和对象
  3. pls-00302: 必须声明 组件_手把手教你开发vue组件库
  4. ios 之 autoresizing小解
  5. 记一次棋牌游戏 cocos2d-x LUA脚本解密
  6. Python中enumerate对象的用法与特点
  7. 表达式 jsp_[JSTL表达式] -JSTL中的所有,都在这
  8. go web框架_干货分享:六个知名的Go语言web框架
  9. axure 8 表格合并_多人编辑,自动汇总,领导可见所有?用 SeaTable 表格更简单
  10. BUG Error:Execution failed for task ':app:dexDebug'.
  11. Hibernate入门案例
  12. 对txt文件的高频词汇统计
  13. 笔记本蓝牙显示输入码无效_蓝牙键盘输入码错误无法连接笔记本(win10)
  14. React中的ref属性的使用
  15. redis中的save配置项
  16. KNN分类法与手势识别
  17. Ubuntu20.04安装MongoDB
  18. Linux 查看日志文件命令
  19. ijkplayer实现图形字幕的播放
  20. 硬件工程师遇到的问题总结

热门文章

  1. 分解因子算法——Pollard rho算法
  2. Debugging connection was closed. Reason: WebSocket disconnected
  3. 超长攻略,机器学习基石!带你涉足王者之巅
  4. mac安装软件提示不被信任的程序
  5. 求购二手《良葛格Java JDK 5.0学习笔记》
  6. used in key specification without a key length
  7. Libgdx游戏编程之卡牌游戏UI布局
  8. 【印刷行业】RICOH MH5422和MH5442喷头(G6+)
  9. 目标检测的数据集制作一般流程(Pascal VOC标准格式)
  10. Android 仿应用宝下载进度条