python - 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:对不起我的英语。
解决方案
因为我认为您对 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
推荐阅读
- java - 从 Java 访问时,Kotlin 对象是私有的
- python - 删除熊猫数据框标头中的所有空格
- git - 如何在 ZSH 中获取当前的 git 分支名称?
- spring - 使用 Jsoup connect 连接到 jenkins
- unity3d - RTX 递归渲染
- reactjs - 将 Fetch 与 React 组件一起使用
- c# - 优化霍夫曼表符号检索(顺序和渐进 JPEG)
- postgresql - 如何将 tokio_postgres 与 Warp 一起使用?
- google-apps-script - 如何颠倒拼接的顺序?
- javascript - 在 HTML 中计算引号内的文本的理想方法是什么?