题意

瑞神今年大三了,他在寒假学会了英文的26个字母,所以他很兴奋!于是他让他的朋友TT考考他,TT想
到了一个考瑞神的好问题:给定一个字符串,从里面寻找连续的26个大写字母并输出!但是转念一想,
这样太便宜瑞神了,所以他加大了难度:现在给定一个字符串,字符串中包括26个大写字母和特殊字
符’?’,特殊字符’?'可以代表任何一个大写字母。现在TT问你是否存在一个位置连续的且由26个大写字
母组成的子串,在这个子串中每个字母出现且仅出现一次,如果存在,请输出从左侧算起的第一个出现
的符合要求的子串,并且要求,如果有多组解同时符合位置最靠左,则输出字典序最小的那个解!如果
不存在,输出-1! 这下HRZ蒙圈了,他刚学会26个字母,这对他来说太难了,所以他来求助你,请你帮
他解决这个问题,报酬是可以帮你打守望先锋。
说明:字典序 先按照第一个字母,以 A、B、C……Z 的顺序排列;如果第一个字母一样,那么比较第二
个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,SIGH 和 SIGHT),那么把短者排
在前。例如

AB??EFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABDCEFGHIJKLMNOPQRSTUVWXYZ
上面两种填法,都可以构成26个字母,但是我们要求字典序最小,只能取前者。
注意,题目要求的是 第一个出现的,字典序最小的!

输入格式:输入只有一行,一个符合题目描述的字符串。
输出格式:输出只有一行,如果存在这样的子串,请输出,否则输出-1

样例1:
input:
ABC??FGHIJK???OPQR?TUVWXY?
output:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
样例2:
input:
AABCDEFGHIJKLMNOPQRSTUVW??M
ouput:
-1

思路

  • 我们输入只有一个字符串,长度大于26,需要得到的是最先出现的一个长度为26的字字符串,我们想到肯定是从开始遍历进行判断,每次判断26个字母,故使用尺取法进行,会比较便利;
  • 尺取法只需要每次得到26个字母即可,对于这26个字母,我们使用两个map变量进行一个字符和数字的转化:
    map<char, int> a;     //每一个字符代表的数字map<int, char> b;   //表示每一个字符a['A'] = 1; b[1] = 'A';a['B'] = 2; b[2] = 'B';a['C'] = 3; b[3] = 'C';a['D'] = 4; b[4] = 'D';a['E'] = 5; b[5] = 'E';a['F'] = 6; b[6] = 'F';a['G'] = 7; b[7] = 'G';a['H'] = 8; b[8] = 'H';a['I'] = 9; b[9] = 'I';a['J'] = 10; b[10] = 'J';a['K'] = 11; b[11] = 'K';a['L'] = 12; b[12] = 'L';a['M'] = 13; b[13] = 'M';a['N'] = 14; b[14] = 'N';a['O'] = 15; b[15] = 'O';a['P'] = 16; b[16] = 'P';a['Q'] = 17; b[17] = 'Q';a['R'] = 18; b[18] = 'R';a['S'] = 19; b[19] = 'S';a['T'] = 20; b[20] = 'T';a['U'] = 21; b[21] = 'U';a['V'] = 22; b[22] = 'V';a['W'] = 23; b[23] = 'W';a['X'] = 24; b[24] = 'X';a['Y'] = 25; b[25] = 'Y';a['Z'] = 26; b[26] = 'Z';a['?'] = 27; b[27] = '?';
  • 使用a变量,以及一个c数组(c数组的下标对应的是a数组的值),通过循环得到每一个字符的数目
    for (int i = left; i <= right; i++) //left=0,right=25,这是尺取法初始化的区间端点{c[a[s.at(i)]]++;//初始化C数组}
  • 尺取的26个字符会出现 ?,那么就会有26个字母没有出现的,我们使用?进行代替这些没有出现的,且字典序最小,那我们先找出没出现的字母,将其的索引,也就是b中的值存储在队列中;
 for (int i = 1; i <= 26; i++){//存放不存在的字符if (c[i] == 0) {  //此处的i就是b数组中字符对应的值q.push(i);count++;}}
  • 那我们何时跳出尺取?如果?的数目等于没出现的字符数目,我们便可以跳出;
  • 跳出尺取后,我们要进行输出,输出26个,?用字符替换,那么替换的时候,需要使用b数组,下标就是我们取队首元素即可
  • 由于队列时FIFO结构,所以自然有序;

总结

对于此题,每次需要判断的是一个长度为26的区间,且区间需要进行移动,所以尺取法就很不错,但是此时的尺取法是伪尺取法,因为左右区间同步移动;

实验中错误

以为在未出现字符数目count==c[27]的时候还要进行判断是否有一个元素出现两次,首先这是不可能的;之前没有意识到,进行重复的判断,然后中途出错了。

代码

#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
int main()
{map<char, int> a;     //每一个字符代表的数字map<int, char> b;   //表示每一个字符int c[28];  //用来存储每一个字符的数目;int cot=-1;//不存在输出;bool exist = false;a['A'] = 1; b[1] = 'A';a['B'] = 2; b[2] = 'B';a['C'] = 3; b[3] = 'C';a['D'] = 4; b[4] = 'D';a['E'] = 5; b[5] = 'E';a['F'] = 6; b[6] = 'F';a['G'] = 7; b[7] = 'G';a['H'] = 8; b[8] = 'H';a['I'] = 9; b[9] = 'I';a['J'] = 10; b[10] = 'J';a['K'] = 11; b[11] = 'K';a['L'] = 12; b[12] = 'L';a['M'] = 13; b[13] = 'M';a['N'] = 14; b[14] = 'N';a['O'] = 15; b[15] = 'O';a['P'] = 16; b[16] = 'P';a['Q'] = 17; b[17] = 'Q';a['R'] = 18; b[18] = 'R';a['S'] = 19; b[19] = 'S';a['T'] = 20; b[20] = 'T';a['U'] = 21; b[21] = 'U';a['V'] = 22; b[22] = 'V';a['W'] = 23; b[23] = 'W';a['X'] = 24; b[24] = 'X';a['Y'] = 25; b[25] = 'Y';a['Z'] = 26; b[26] = 'Z';a['?'] = 27; b[27] = '?';for (int i = 1; i <=27; i++)c[i] = 0;string s;cin >> s;//使用尺取法进行求取;int left = 0, right = 25;for (int i = left; i <= right; i++){c[a[s.at(i)]]++;//初始化C数组}queue<int>  q;//存放不存在的字符while (right < s.size()){while (!q.empty())q.pop();int count = 0;//用来记录不存在字符数目for (int i = 1; i <= 26; i++){//存放不存在的字符if (c[i] == 0) {q.push(i);count++;}}if (c[27] == count){  exist = true;break;}else{cot = -1;}c[a[s.at(left)]]--;left++;right++;if (right == s.size())break;c[a[s.at(right)]]++;}if (exist) {for (int i = left; i <= right; i++){if (s.at(i) != '?')cout << s.at(i);else{int temp = q.front();cout << b[temp];q.pop();}}}elsecout << cot;return 0;
}

week8-csp-B(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. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  6. Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制

    文章目录 前言 CSP 特点 CSP代码 演示 1. 正常流程的代码 2. CSP 未设置buffer 代码 3. 设置指定大小的channel buffer 总结 前言 CSP 这个名词大家会比较陌 ...

  7. 考csp所需算法_CSP vs RxJS:您所不知道的。

    考csp所需算法 by Kevin Ghadyani 通过凯文·加迪亚尼(Kevin Ghadyani) CSP vs RxJS:您所不知道的. (CSP vs RxJS: what you don' ...

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

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

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

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

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

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

最新文章

  1. creo减速器建模实例_3.16减速器箱体附件建模
  2. java 复制字段_java - 在构造函数中按字段复制字段 - 我需要一个更简洁的形式 - SO中文参考 - www.soinside.com...
  3. delay在java中有什么用_DelayQueue怎么在Java多线程并发开发中使用
  4. Java中的时间和日期(上)
  5. bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树
  6. 机器学习之监督学习(一)——决策树
  7. 3 笔经小结-智力篇
  8. 固高运动控制卡跟随运动(Follow 运动模式)
  9. vue 时间插件限制选择时间
  10. JCMsuite应用:闪耀光栅
  11. Vue在Nginx的使用
  12. 凸优化读书笔记01(仿射集合、仿射组合,仿射包)
  13. 哈希表、哈希桶(C++实现)
  14. 程序员:职业很抓狂!前途很迷茫?送你破解困境秘籍!
  15. 计算机连上wifi无法上网了,电脑已连接wifi但无法上网 已连接wifi但电脑无法上网-192路由网...
  16. 如何通过简历推销自己
  17. spanning tree增强
  18. 计算机程序怎么读英语,编程序是什么意思
  19. 2021年安全员-C证-专职安全生产管理人员(广东省)考试APP及安全员-C证-专职安全生产管理人员(广东省)证考试
  20. Clojure CLR 入门

热门文章

  1. 基于Proteus学习单片机系列(一)——点亮LED
  2. 适合苹果4s的微信版本_苹果:这些旧 iPhone 有重大缺陷,怕不怕?
  3. unity 弹痕_Unity C# 用图片融合做弹孔
  4. mac如何看html5视频播放器,适用于Mac的HTML5视频播放器
  5. Intel E100 网卡驱动实例分析
  6. 最新最快的HTTP代理服务器,国内外HTTP代理服务器,游戏代理服务器,Q代理服务器,代理IP...
  7. JS中的一些条件判断语句
  8. No.44-VulnHub-Pegasus: 1-Walkthrough渗透学习
  9. 有关win10的C:/ProgramFiles\WindowsApps\文件系统错误(12007)问题
  10. 进阶HTML--认识标签嵌套与并列关系 -----16岁的小前端