1. 问题描述
给定一个表示勒索信的内容的字符串和另一个表示杂志内容字符串,写一个方法判断能否通过剪下杂志中的内容构造出这封勒索信,若可以返回True, 反之 False (每个字母仅能使用一次)[仅仅支持26个英文字母的输入]
2. 问题示例
- 输入 ransomNote = ‘aa’,magazine = ‘aab’,输出True
- 输入 ransomNote = ‘asdfdfa’,magazine = ‘adfdhfdfabs’,输出True
3. 代码实现
class Solution:
'''
参数 ransomNote :字符串
参数 magazine: 字符串
返回布尔类型
'''
# 注意这个方法的使用
def canConstruct(self,ransomNote,magazine):
arr = [0] * 26 # 对应26个字母
for c in magazine:
arr[ord(c) - ord('a')] += 1 #①② 字符串相同字母共用一个空间 例如 arr[3]=4 代表字母d一共出现三次
for c in ransomNote:
arr[ord(c) - ord('a')] -= 1
if arr[ord(c) - ord('a')] < 0: # 若<0代表勒索信中的某个字母多于杂志中的某个字母 故False
return False
return True
# 主函数
if __name__ == '__main__':
s = Solution()
ransomNote = input('请输入勒索字符串:')
magazine = input('请输入杂志字符串:')
print('勒索信内容:',ransomNote)
print('杂志内容:',magazine)
print('输出:',s.canConstruct(ransomNote,magazine))
4. 思路分析
- 首先创建空间大小为26的列表:arr = [0] * 26
- 其次通过字母ASCAII码值来对应杂志中字母出现的次数:0-a,1-b,依次类推
- 对上个步骤生成的arr数组进行逆推,做减法,若出现小于0的情况代表勒索信中的某个字母出现的次数多余杂志中该字母出现的次数,因此无法构成勒索信内容。
5. 运行结果
总结
1. ASCAII码表
01000001 65 41 A
01000010 66 42 B
01000011 67 43 C
01000100 68 44 D
01000101 69 45 E
01000110 70 46 F
01000111 71 47 G
01001000 72 48 H
01001001 73 49 I
01001010 74 4A J
01001011 75 4B K
01001100 76 4C L
01001101 77 4D M
01001110 78 4E N
01001111 79 4F O
01010000 80 50 P
01010001 81 51 Q
01010010 82 52 R
01010011 83 53 S
01010100 84 54 T
01010101 85 55 U
01010110 86 56 V
01010111 87 57 W
01011000 88 58 X
01011001 89 59 Y
01011010 90 5A Z
01100001 97 61 a
01100010 98 62 b
01100011 99 63 c
01100100 100 64 d
01100101 101 65 e
01100110 102 66 f
01100111 103 67 g
01101000 104 68 h
01101001 105 69 i
01101010 106 6A j
01101011 107 6B k
01101100 108 6C l
01101101 109 6D m
01101110 110 6E n
01101111 111 6F o
01110000 112 70 p
01110001 113 71 q
01110010 114 72 r
01110011 115 73 s
01110100 116 74 t
01110101 117 75 u
01110110 118 76 v
01110111 119 77 w
01111000 120 78 x
01111001 121 79 y
01111010 122 7A z
2. ord()
①ord():
>>>ord('a')
97
>>> ord('b')
98
>>> ord('c')
99
②arr[ord(c) - ord('a')] += 1
等价于
arr[ord(c) - ord('a')] = arr[ord(c) - ord('a')] + 1