首页 > 解决方案 > Python 中 Try 和 except 的更快替代方案

问题描述

问题:

完成函数 scramble(str1, str2),如果 str1 字符的一部分可以重新排列以匹配 str2,则返回 true,否则返回 false。

笔记:

  • 仅使用小写字母 (az)。不包含标点符号或数字。
  • 需要考虑性能

我可以在 C 中解决这个问题。由于我对学习 Python 很感兴趣,所以我也尝试在 Python 中执行此操作,但不幸的是出现超时错误。我不知道如何在 Python 中解决它,就像在 C 中一样。

所以,请告诉我如何在 Python 中有效地做到这一点,最好使用与 C 相同或更好的技术。

#include <stdbool.h>

bool scramble(const char* str1, const char* str2)
{
    // store number of occurrences of each character in str1 to arr
    int arr[26] = { 0 };

    while (*str1) {
        arr[*str1 - 'a'] += 1;
        str1++;
    }

    // check if each character of str2 is in arr
    while (*str2) {

        if (arr[*str2 - 'a'] >= 1)
            arr[*str2 - 'a'] -= 1;
        else
            return false;

        str2++;
    }

    return true;
}

我的 Python 代码可能正确但超时:

def scramble(s1, s2):
    text = list(s1)

    for char in s2:
        try:
            text.remove(char)
        except ValueError:
            return False

    return True

另外,如果您发现我的 C 代码有问题,请通知我。

PS:对不起我的英语。

标签: pythonc

解决方案


因为我认为您对 Python 很陌生。您可以找到有关收藏的更多信息:https ://www.google.com/url?sa=t&source=web&rct=j&url=https://docs.python.org/2/library/collections.html&ved=2ahUKEwj9wICRqfPoAhVo73MBHRcBAq8QFjAAegQIBBAC&usg=AOvVaw2mS2EUGTioSwy05lVk67KH

defaultdict集合包/库的一种方法,它用一些初始值初始化数据结构。例子:

import collections
counter = collections.defaultdict(int)
print(counter[ANY_KEY])
print(counter)

输出:

0
{ANY_KEY: 0}

因此,由于我们已经给出了defaultdict(int)ie int,定义任何键将始终使用括号中给出的值进行初始化

import collections
def scramble(s1, s2):
    counter = collections.defaultdict(int)

    for char in s1:
        counter[char]+=1
    for char in s2:
         counter[char]-=1
         if counter[char] <= -1:
             return False
    return True

推荐阅读