1. 问题描述:
农夫约翰试图通过给奶牛一套通常用于学龄前儿童的 N 个拼写板来教他的奶牛阅读。每个拼写板的每一侧都有一个单词和一个图画。例如,一侧可能有单词 cat 和一只小猫,另一侧可能有单词 dog 和一只小狗。因此,当所有拼写板放置到地面上时,会显示一组 N 个单词。通过翻转其中一部分板子,就可以得到另一组 N 个单词。为了帮助奶牛练习单词拼写,约翰想要制作一些木块,在每个木块上都印上一个字母,使得奶牛可以使用这些木块拼出看到的单词。为了使得无论哪一组 N 个单词朝上显示,奶牛都能将其全部拼出,就需要印有各种字母的木块都足够的多。例如,如果 N=3 且单词 box,cat,car 朝上显示,则奶牛至少需要一个 b 块,一个 o 块,一个 x 块,两个 c 块,两个 a 块,一个 t 块和一个 r 块。请帮助约翰确定,印有每种字母的木块至少需要提供多少块,才能使得不管每个板子的哪一侧朝上显示,奶牛都可以拼出所有 N 个可见的单词。
输入格式
第一行包含整数 N。接下来 N 行,每行包含两个单词,这两个单词分别位于一块木板的两侧,每个单词都是长度不超过 10 的小写字母构成的字符串。
输出格式
共 26 行。第一行输出印有字母 a 的木块所需的块数。第二行输出印有字母 b 的木块所需的块数,以此类推。
数据范围
1 ≤ N ≤ 100
输入样例:
3
fox box
dog cat
car bus
输出样例:
2
2
2
1
0
1
1
0
0
0
0
0
0
0
2
0
0
1
1
1
1
0
0
1
0
0
样例解释
在此样例中,共有 N=3 块拼写板,共有 8 种单词组合:
fox dog car
fox dog bus
fox cat car
fox cat bus
box dog car
box dog bus
box cat car
box cat bus
来源:https://www.acwing.com/problem/content/description/1815/
2. 思路分析:
分析题目可以知道对于每一组拼接板内部与拼写板之间都是独立的所以我们可以求解出每一组中对应字母出现次数的最大值然后将其累加起来即可。这样不管哪一组都可以完成拼写板的单词。
3. 代码如下:
import collections
class Solution:
def process(self):
n = int(input())
res = [0] * 26
for i in range(n):
s = input().split()
x, y = [0] * 26, [0] * 26
for c in s[0]:
# ord函数计算出当前字符c的acsii码
x[ord(c) - ord("a")] += 1
for c in s[1]:
y[ord(c) - ord("a")] += 1
for j in range(26):
res[j] += max(x[j], y[j])
for i in range(26):
print(res[i])
if __name__ == '__main__':
Solution().process()