/*
【字符串 逻辑分析】
小强在参加《密室逃生》游戏,当前关卡要求找到符合给定密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。
每个箱子中都有一个字符串s,字符串由大写字母、小写字母、数字、标点符号、空格组成,
需要在这些字符串中找到所有的字母,忽略大小写后排列出对应的密码串儿,并返回匹配密码的箱子序号。
提示:满足条件的箱子不超过1个
输入描述
第一行为key的字符串,
第二行为箱子boxes,为数组样式,以空格分隔箱子
N数量满足1≤N≤10000,
s长度满足0≤s.length≤50,
密码为仅包含小写字母的升序字符串,且不存在重复字母,密码K长度K.length,1<K.length≤26
输出描述
返回对应箱子编号
如不存在符合要求的密码箱,则返回-1
示例一
输入
abc
sdf134 A2c4b
输出
2说明
第2个箱子中的Abc,符合密码abc
示例二
输入
abc
sdf134 A2c4bd 523[]
abc
sdf134 A2c4bf 523[]
cdf
sdf134 A2c4df 523[]
输出
-1
说明
第2个箱子中的Abcd,与密码不完全匹配,不符合要求
备注
箱子中字符拼出的字符串与密码的匹配忽略大小写,且要求与密码完全匹配,如密码abc匹配aBc,但是密码abc不匹配abcd
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
int main () {
char keys[1000];
//fgets(keys, 1000, stdin);//这里的keys里包含\n,长度要+1
scanf("%s",keys);
getchar();
char input_str[10000];
fgets(input_str, 10000, stdin);
char* single_ops[1000];
int count = 0;
char* token = strtok(input_str, " ");
while (token != NULL) {
single_ops[count++] = token;
token = strtok(NULL, " ");
}
int result = -1;
for (int i = 0; i < count; ++i) {
int chars[256] = {0};
for (int j = 0; j < strlen(single_ops[i]); j++) {
char c = single_ops[i][j];
if (c>='a'&&c<='z'){
chars[c]++;
}
if (c>='A'&&c<='Z'){
chars[c-'A'+'a']++;//A:65 Z:90 a:97 z:122
}
}
//对比chars里是否包含了keys
int flag = 0;
for (int j = 0; j < strlen(keys); j++){
if (chars[keys[j]] != 1) {
flag = 1;
break;
}
}
//对示例二而言,仅仅对比chars里是否有abc是不够的
//还要看内部是否有除abc以外的字母,若有其他字母,比如abcd,abcf都不行
for( int j = keys[strlen(keys) - 1] + 1; j <= 'z'; j++){//比对c右边元素,即d ~ z
if (chars[j] == 1) {
flag = 1;
break;
}
}
for( int j = keys[0] - 1; j >= 'a'; j--){//比对a左边元素,因为keys最左边就是a,所以不会进入循环
if (chars[j] == 1) {
flag = 1;
break;
}
}
if(flag == 0){
result = i + 1;
break;
}
}
printf("%d",result);
return 0;
}
密室逃生游戏【C语言】
于 2023-03-16 03:24:49 首次发布