1. 问题描述:
农夫约翰拥有 N 头有斑点的牛和 N 头没有斑点的牛。他刚刚完成了牛遗传学课程,他确信奶牛上的斑点是由牛基因组突变引起的。农夫约翰花了大价钱对他的奶牛的基因组进行了测序。每个基因组都是一个由四个字符 A,C,G,T 构成的长度为 M 的字符串。当他统计得到的奶牛的基因组序列时,可以得到一个如下所示的表:(此时,N=3)位置 : 1 2 3 4 5 6 7 ... M
斑点牛 1: A A T C C C A ... T
斑点牛 2: G A T T G C A ... A
斑点牛 3: G G T C G C A ... A
普通牛 1: A C T C C C A ... G
普通牛 2: A C T C G C A ... T
普通牛 3: A C T T C C A ... T
通过仔细观察该表,他发现通过位置 2 的字符足以判断奶牛是否存在斑点。也就是说,仅通过查看这个位置上的字符,农夫约翰就可以判断他的哪些奶牛有斑点,哪些没有斑点。(在这里,A 和 G 表示有斑点,C 表示无斑点,T 无关紧要,因为没有任何一头牛的第二个位置上的字符是 T)位置 1 上的字符不足以判断奶牛是否存在斑点,因为 A 既可以表示有斑点也可以表示无斑点。给定约翰的奶牛的基因组序列列表,请你计算可以单独用来判断奶牛是否存在斑点的位置的数量。
输入格式
第一行包含两个整数 N 和 M。接下来 N 行,每行包含一个长度为 M 的字符串,用来描述斑点牛的基因组序列。再接下来 N 行,每行包含一个长度为 M 的字符串,用来描述普通牛的基因组序列。
输出格式
输出可以单独用来判断奶牛是否存在斑点的位置的数量。
数据范围
1 ≤ N,M ≤ 100
输入样例:
3 8
AATCCCAT
GATTGCAA
GGTCGCAA
ACTCCCAG
ACTCGCAT
ACTTCCAT
输出样例:
1
来源:https://www.acwing.com/problem/content/description/1778/
2. 思路分析:
分析题目可以知道我们可以枚举每一个位置,当当前位置斑点牛和普通牛没有交集的时候说明当前位置可以判断出是哪一种牛,如何判断两个集合是否存在交集呢?其中一个比较常用的方法是使用一个哈希表来记录其中一个集合中的元素,当枚举另外一个集合元素的时候如果发现当前枚举的元素在哈希表中说明存在交集。
3. 代码如下:
class Solution:
def process(self):
n, m = map(int, input().split())
# s1, s2分别用来描述斑点牛与普通牛的基因序列
s1, s2 = list(), list()
for i in range(n):
s1.append(input())
for i in range(n):
s2.append(input())
res = 0
for i in range(m):
mp = dict()
for j in range(n):
if s1[j][i] not in mp: mp[s1[j][i]] = 1
flag = 1
for j in range(n):
# 两个集合存在交集
if s2[j][i] in mp:
flag = 0
break
if flag: res += 1
return res
if __name__ == '__main__':
print(Solution().process())