字母汤 - 确定您是不是可以用汤碗中的字母写下您的信息

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': 1all() 是一个内置函数,用于检查谓词是否对序列的所有元素都成立,see the doc; all(n &lt;= 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

【讨论】:

以上是关于字母汤 - 确定您是不是可以用汤碗中的字母写下您的信息的主要内容,如果未能解决你的问题,请参考以下文章

检查输入字符串是不是包含javascript中的数字

如何检查图像资产是不是存在,然后将其用作圆形头像或在圆形头像中写下姓名的第一个字母

在 UITextView 中显示带有超大首字母的文本块

sequelize.js 中的字母数字 ID

IE 和 Firefox 中的 Lato 字体缺少字母

如何确定字符串是不是包含非字母数字字符?