问题描述
我被赋予了在 python 中解决的任务,需要帮助,因为我无法获得输出,以下是问题:-
每个人都喜欢字母汤。当然,您想知道是否可以根据碗中的字母构造一条消息。
您的任务:
- 你想写的信息
- 在你的一碗字母汤中找到的所有字母
假设:
该函数应该确定您是否可以用碗汤中的字母来写信息。该函数应相应地返回 True 或 False。
尽量使您的功能高效。请使用 Big-O 表示法根据消息的长度 (m) 和一碗汤中的字母数 (s) 来解释您的函数运行所需的时间。
下面是我尝试过的代码,但它没有按照任务工作:-
def sol(alpha):
srt = sorted(list(alpha))
lwcase = sorted(list(alpha.lower()))
upcase = []
result = ''
for i in srt:
if i.isupper():
upcase.append(i)
for e in lwcase:
if upcase.count(e.upper()) != 0:
result += e.upper()
upcase.pop(upcase.index(e.upper()))
else:
result += e
return result
it = input("Enter a word please")
print(sol(it))
解决方法
我假设你的老师希望你自己编写一个算法来从头开始。然而,知道如何使用标准库的模块是一项非常有用的技能。这是使用 collections.Counter
的解决方案,它是 dict
的子类。
代码
import collections
def validate_soup(msg,soup):
msg_preprocessed = ''.join(msg.lower().split())
soup_preprocessed = ''.join(soup.lower().split())
msg_count = collections.Counter(msg_preprocessed)
soup_count = collections.Counter(soup_preprocessed)
return all(n <= soup_count[k] for k,n in msg_count.items())
测试
>>> validate_soup('Hello World','loollhed')
False
>>> validate_soup('Hello World','loollhedw')
False
>>> validate_soup('Hello World','loolhedwr')
False
>>> validate_soup('Hello World','loollhedwr')
True
>>> validate_soup('Hello World','abcloollhedwrdef')
True
说明
首先是处理步骤。
-
.lower()
将消息设为小写,因此'Hello World'
和hello world
是等价的,see the documentation; -
''.join(s.split())
从字符串s
,see this question 中删除所有空格; - 另见该问题:Python: remove all non-alphabet chars from string?;
然后,计数器:
-
collections.Counter(seq)
生成一个字典,将seq
的元素映射到它们出现的次数,例如Counter('helloworld') == {'l': 3,'o': 2,'h': 1,'e': 1,'w': 1,'r': 1,'d': 1}
; -
all()
是一个内置函数,用于检查谓词是否适用于序列的所有元素,see the doc; -
all(n <= soup_count[k] for k,n in msg_count.items())
检查消息中出现的每个字符n
的计数k
是否低于(或等于)汤中字符k
的计数。
这是我的解决方案(见评论):
def validate_soup(s: str,chars: str)-> bool:
d = {}
for c in chars:
count = d.get(c,0)
d[c] = count + 1
for c in s:
count = d.get(c,0)
if count <= 0:
return False
d[c] = count - 1
return True