题目描述
小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成) 的箱子,并给出箱子编号,箱子编号为 1~N 。
每个箱子中都有一个 字符串s ,字符串由大写字母、小写字母、数字、标点符号、空格组成,需要在这些字符串中找到所有的字母,忽略大小写后排列出对应的密码串,并返回匹配密码的箱子序号。
提示:满足条件的箱子不超过1个。
输入描述
第一行为 key 的字符串,
第二行为箱子 boxes,为数组样式,以空格分隔
- 箱子 N 数量满足 1 ≤ N ≤ 10000,
- s 长度满足 0 ≤ s.length ≤ 50,
- 密码为仅包含小写字母的升序字符串,且不存在重复字母,
- 密码 K 长度1 ≤ K.length ≤ 26
输出描述
返回对应箱子编号
如不存在符合要求的密码箱,则返回 -1。
备注
箱子中字符拼出的字符串与密码的匹配忽略大小写,且要求与密码完全匹配,如密码abc匹配aBc,但是密码abc不匹配abcd
用例
输入 | abc s,sdf134 A2c4b |
输出 | 2 |
说明 | 第 2 个箱子中的 Abc ,符合密码 abc。 |
输入 | abc s,sdf134 A2c4bd 523[] |
输出 | -1 |
说明 | 第2个箱子中的Abcd,与密码不完全匹配,不符合要求 |
题目解析
问题描述
小强正在参加一个“密室逃生”游戏,他需要找到一个符合给定密钥 KKK(升序的不重复小写字母组成)的箱子,并返回箱子编号。每个箱子中都有一个字符串 SSS,字符串由大小写字母、数字、标点符号、空格组成。需要在这些字符串中找到所有的字母,并忽略大小写后排列成升序,与密钥 KKK 进行匹配。满足条件的箱子不会超过一个。
输入描述
- 第一行为密钥 keykeykey 的字符串。
- 第二行为箱子序列 boxesboxesboxes,为数组形式,以空格分隔。
- 箱子 NNN 数量满足 1≤N≤100001 \leq N \leq 100001≤N≤10000
- KKK 度满足 0≤S.length≤500 \leq S.length \leq 500≤S.length≤50
- 密钥为仅包含小写字母的升序字符,且不存在重复字母
- 密钥 KKK 长度 1≤K.length≤261 \leq K.length \leq 261≤K.length≤26
输出描述
返回对应箱子编号,如果不存在符合要求的密钥,则返回 -1。
示例
输入:
abc
s,sdf134 A2c4b
输出:
2
解释:第2个箱子的 A2c4b
符合密钥 abc
。
解题思路
- 提取字母:从每个箱子字符串中提取所有字母,忽略大小写后排序。
- 匹配密钥:将提取的字母排序后与密钥进行匹配。
- 返回结果:找到匹配的箱子编号,如果没有找到,返回 -1。
C++代码实现
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
// 提取并排序字符串中的字母
string extractAndSortLetters(const string& s) {
string letters;
for (char c : s) {
if (isalpha(c)) {
letters += tolower(c);
}
}
sort(letters.begin(), letters.end());
return letters;
}
int main() {
string key;
getline(cin, key);
vector<string> boxes;
string box;
while (getline(cin, box, ' ')) {
boxes.push_back(box);
}
string sortedKey = extractAndSortLetters(key);
for (int i = 0; i < boxes.size(); ++i) {
string sortedBoxLetters = extractAndSortLetters(boxes[i]);
if (sortedBoxLetters == sortedKey) {
cout << i + 1 << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}
代码说明
- extractAndSortLetters函数:提取字符串中的字母,转换为小写并排序。
- 主函数:读取输入的密钥和箱子序列,对每个箱子字符串提取字母并排序后与密钥进行比较,找到匹配的箱子编号并输出,如果没有匹配的,输出 -1。
这个程序能够找到符合密钥要求的箱子,并返回箱子编号。
python代码实现
def extract_and_sort_letters(s):
letters = [c.lower() for c in s if c.isalpha()]
return ''.join(sorted(letters))
def find_matching_box(key, boxes):
sorted_key = extract_and_sort_letters(key)
for i, box in enumerate(boxes):
sorted_box_letters = extract_and_sort_letters(box)
if sorted_box_letters == sorted_key:
return i + 1
return -1
# 读取输入
key = input().strip()
boxes = input().strip().split()
# 计算并输出结果
print(find_matching_box(key, boxes))
代码说明
- extract_and_sort_letters函数:提取字符串中的字母,转换为小写并排序。
- find_matching_box函数:对每个箱子字符串提取字母并排序后与密钥进行比较,找到匹配的箱子编号并返回,如果没有匹配的,返回 -1。
- 读取输入:通过
input().strip()
读取密钥和箱子序列。 - 计算并输出结果:调用
find_matching_box
函数计算匹配的箱子编号,并输出结果。
这个Python程序能够找到符合密钥要求的箱子,并返回箱子编号。你可以在Python环境中运行这个程序来实现该功能。