华为OD机试统一考试 - 万能字符单词拼写
题目描述
有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。
words 的字符仅由 a-z 英文小写宁母组成,例如“abc”。
chars 由 a- z 英文小写字母和“?”组成,其中英文“?"表示万能字符,能够在拼写时当作任意一个英文字母。例如“?"可以当作"a"等字母。
注意: 每次拼写时,chars 中的每个字母和万能字符都只能使用一次。
输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。
输入描述
第一行: 输入数组 words 的个数,记作N。
第二行~第N+1行: 依次输入数组words的每个字符串元素。
第N+2行: 输入字符串 chars
输出描述
输出一个整数,表示词汇表 words 中你掌握的单词个数
备注
1 <= words.length <= 100
1 <= words[i].length, chars.length <= 100
所有字符串中都仅包含小写英文字母、英文问号
示例1
输入 4 cat bt hat tree atach?? 输出 3 说明:可以掌握的单词 "cat”、“bt"和"hat"。
示例2
输入 3 hello world cloud welldonehohneyr 输出: 2 说明:可以掌握的单词 "hello”、“world"。
示例3
输入 3 apple car window welldoneapplec? 输出: 2 说明:可以掌握的单词 "apple”、“car"。
代码
// // test_2.swift // SwiftODTest // // Created by jdm on 9/6/24. // import Foundation func ODTest_2() { print("第一行: 输入数组 words 的个数,记作N") let wordCount = Int(readLine() ?? "") ?? 0 print("第二行~第N+1行: 依次输入数组words的每个字符串元素") var words: [String] = [] for _ in 0 ..< wordCount { words.append(readLine() ?? "") } print("第N+2行: 输入字符串 chars") let chars = readLine() ?? "" print("输出") let count = countWords(words, chars) print(count) } func countWords(_ words: [String], _ chars: String) -> Int { var count = 0 for index in 0 ..< words.count { if canFormWord(words[index], chars) { count += 1 } } return count } func canFormWord(_ word: String, _ chars: String) -> Bool { var charsCount: [Character: Int] = [:] // 统计 chars 中每个字符的个数 for char in chars { charsCount[char] = charsCount[char] ?? 0 + 1 } var wildcards = charsCount["?"] ?? 0 // 检查 word 中每个字符是否能被 chars 中的字符拼写 for char in word { if (charsCount[char] ?? 0) > 0 { charsCount[char] = (charsCount[char] ?? 0) - 1 } else if wildcards > 0 { wildcards -= 1 } else { return false } } return true }
2024华为OD机试卷题 文章被收录于专栏
本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。