字母汤 - 确定您是不是可以用汤碗中的字母写下您的信息
Posted
技术标签:
【中文标题】字母汤 - 确定您是不是可以用汤碗中的字母写下您的信息【英文标题】:Alphabet Soup -Determine if you can write your message with the letters found in your bowl of soup字母汤 - 确定您是否可以用汤碗中的字母写下您的信息 【发布时间】:2021-08-21 15:41:44 【问题描述】:我被分配了一个在 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))
【问题讨论】:
现在在手机上,但这里有一个想法:根据可用频率在汤中创建一个字母字典(需要 O(s))。然后遍历你的单词,看看每个字母的频率是否为零(或者它根本不在汤字典中)。如果为真,则返回假。否则,减少相应字符的可用频率计数 (O(m))。总时间为 O(m+s)。也许有一个使用多集结构或其他东西的更有效的实现,但这是一个好的开始。 非常感谢威廉,这段代码很有用。 【参考方案1】:我假设你的老师希望你自己编写一个从头开始的算法。但是,知道如何使用标准库的模块是一项非常有用的技能。这是一个使用 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())
检查消息中出现的每个字符 k
的计数 n
是否低于(或等于)汤中字符 k
的计数。
【讨论】:
【参考方案2】:这是我的解决方案(见评论):
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
【讨论】:
以上是关于字母汤 - 确定您是不是可以用汤碗中的字母写下您的信息的主要内容,如果未能解决你的问题,请参考以下文章