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

Alphabet Soup -Determine if you can write your message with the letters found in your bowl of soup

我在 python 中接到了一个任务要解决,需要帮助,因为我无法获得输出,下面是问题:-

每个人都喜欢字母汤。当然,您想知道您是否可以根据碗中的字母构建一条消息。

您的任务:

编写一个将两个字符串作为输入的函数:

  1. 您要写的消息
  2. 在你的一碗字母汤中找到的所有字母

假设:

该函数应确定您是否可以使用在汤碗中找到的字母来写消息。该函数应相应地 return True 或 False。

努力使您的功能高效。请使用大 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))

这是我的解决方案(见评论):

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

我假设你的老师希望你自己编写一个算法来进行 scratch。然而,了解如何使用标准库的模块是一项非常有用的技能。这是一个使用 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 中的计数汤。