【华为OD-E卷 - 猜字谜100分(python、java、c++、js、c)】
题目
小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中:
变换顺序以后一样的,比如通过变换w和e的顺序,“nwes”跟“news”是可以完全对应的; 字母去重以后是一样的,比如“woood”和“wood”是一样的,它们去重后都是“wod” 请你写一个程序帮忙在谜底库中找到正确的谜底。谜面是多个单词,都需要找到对应的谜底,如果找不到的话,返回”not found”
输入描述
- 谜面单词列表,以“,”分隔 谜底库单词列表,以","分隔
输出描述
- 匹配到的正确单词列表,以",“分隔 如果找不到,返回"not found” 备注 单词的数量N的范围:0 < N < 1000 词汇表的数量M的范围:0 < M < 1000 单词的长度P的范围:0 < P < 20 输入的字符只有小写英文字母,没有其他字符
用例
用例一:
输入:
conection
connection,today
输出:
connection
用例二:
输入:
bdni,wooood
bind,wrong,wood
输出:
bind,wood
python解法
- 解题思路:
- 该题目要求根据输入的 issues 和 answers 两组字符串,找出每个 issue 是否在 answers 中能够找到匹配的答案。如果找到匹配的答案,返回该答案;如果找不到完全匹配的答案,则尝试通过排序后的字符匹配(忽略重复字符)来找到可能的匹配。如果两者都找不到匹配,则返回 “not found”。
解题步骤:
输入处理:
issues 和 answers 都是由逗号分隔的字符串组成,转换成列表格式以便后续处理。
解决匹配问题:
对每个 issue,首先通过 set 去重并排序,生成一个唯一的字符集表示。
如果这个唯一字符集在 answers 中存在,则返回相应的答案。
如果找不到完全匹配的答案,则对 issue 和每个 answer 进行排序,并尝试查找匹配的答案。
如果两种匹配方式都未能找到答案,则返回 “not found”。
结果输出:
所有的结果通过逗号 , 连接成字符串,输出最终的答案。
def getResult2(issues, answers):
result = [] # 用来存储每个issue的匹配结果
# 遍历每个问题(issue)
for issue in issues:
unique_issue = ''.join(sorted(set(issue))) # 通过排序和去重生成唯一的字符表示
found = False # 标记是否找到了匹配的答案
# 首先通过唯一字符匹配来查找
for answer in answers:
unique_answer = ''.join(sorted(set(answer))) # 对每个答案进行相同的处理
# 如果找到了完全匹配的答案,则添加到结果列表并跳出循环
if unique_issue == unique_answer:
result.append(answer)
found = True
break # 结束当前问题的匹配查找
# 如果未找到完全匹配,则对排序后的字符串进行比较
if not found:
sorted_issue = ''.join(sorted(issue)) # 对当前问题字符串排序
for answer in answers:
sorted_answer = ''.join(sorted(answer)) # 对每个答案字符串排序
if sorted_issue == sorted_answer:
result.append(answer)
found = True
break # 结束当前问题的匹配查找
# 如果仍未找到匹配的答案,返回"not found"
if not found:
result.append("not found")
# 返回结果,多个结果用逗号连接成一个字符串
return ",".join(result)
# 输入:问题和答案的字符串,按逗号分隔
issues = input().split(",") # 获取问题列表
answers = input().split(",") # 获取答案列表
# 调用函数并输出结果
print(getResult2(issues, answers))
java解法
- 解题思路
- 本题的任务是根据给定的 puzzleWords(谜题词)和 dictionaryWords(字典词),对每个谜题词寻找与其匹配的字典词。如果一个字典词和谜题词有相同的字符(忽略字符顺序和重复),则认为这个字典词与谜题词匹配。对于每个谜题词,若找到匹配的字典词,则输出该字典词;如果找不到匹配的字典词,则输出 “not found”。
解题步骤:
输入处理:
先读取谜题词 puzzleWords 和字典词 dictionaryWords。
将它们分别拆分为字符串数组,进行后续处理。
匹配规则:
对于每个谜题词,创建一个字符集合 puzzleSet,这个集合包含该词的唯一字符。
然后遍历字典中的每个词,检查该词的字符集合是否与当前谜题词的字符集合相同。
如果匹配,直接返回该字典词。如果遍历完字典词没有找到匹配,则返回 “not found”。
字符集合的使用:
使用 Set 来存储字符,因为集合自动去重,并且无序,使得我们可以忽略字符的顺序和重复。
输出结果:
如果找到匹配的字典词,将其添加到结果列表 matchedWords 中。
如果找不到匹配,添加 “not found”。
最终将所有结果通过逗号连接成字符串并返回。
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建Scanner对象以读取输入
Scanner scanner = new Scanner(System.in);
// 读取谜题词和字典词,并用逗号分割成数组
String[] puzzleWords = scanner.nextLine().split(",");
String[] dictionaryWords = scanner.nextLine().split(",");
// 调用matchWordsBySet方法,输出结果
System.out.println(matchWordsBySet(puzzleWords, dictionaryWords));
}
// 用于根据字符集合匹配谜题词与字典词的函数
public static String matchWordsBySet(String[] puzzleWords, String[] dictionaryWords) {
List<String> matchedWords = new ArrayList<>(); // 存储匹配的字典词
// 遍历每个谜题词
for (String puzzle : puzzleWords) {
boolean isMatched = false; // 标记是否找到匹配的字典词
Set<Character> puzzleSet = getUniqueChars(puzzle); // 获取谜题词的字符集合
// 遍历字典中的每个词
for (String word : dictionaryWords) {
// 如果谜题词的字符集合和字典词的字符集合相同
if (puzzleSet.equals(getUniqueChars(word))) {
matchedWords.add(word); // 将匹配的字典词添加到结果列表
isMatched = true; // 设置匹配标志
break; // 找到匹配的字典词后,跳出字典词遍历
}
}
// 如果没有找到匹配的字典词,添加 "not found"
if (!isMatched) {
matchedWords.add("not found");
}
}
// 将匹配结果列表转换为以逗号分隔的字符串并返回
return String.join(",", matchedWords);
}
// 获取字符串中唯一字符的集合
public static Set<Character> getUniqueChars(String word) {
Set<Character> charSet = new HashSet<>(); // 使用HashSet来存储字符,自动去重
for (char c : word.toCharArray()) {
charSet.add(c); // 将每个字符添加到集合中
}
return charSet; // 返回字符集合
}
}
C++解法
- 解题思路
更新中
C解法
更新中
JS解法
更新中
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏