勒索信⭐


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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值