字谜的乐趣(Python)

问题描述 投票:0回答:1

字谜游戏的乐趣 描述

如果两个字符串是彼此的排列,则它们是字谜词。换句话说,两个字符串具有相同的大小和相同的字符。例如,“aaagmnrs”是“anagrams”的字谜词。给定一个字符串数组,删除作为较早字符串的字谜词的每个字符串,然后按排序顺序返回剩余的数组。

示例

str = ['代码', 'doce', 'ecod', 'framer', '框架']

“code”和“doce”是字谜词。从数组中删除“doce”并保留数组中第一次出现的“code”。 “code”和“ecod”是字谜词。从数组中删除“ecod”并保留数组中第一次出现的“code”。 “代码”和“成帧者”不是字谜。将两个字符串保留在数组中。 由于“framer”中额外的“r”,“framer”和“frame”不是字谜。将两个字符串保留在数组中。 按升序对剩余字符串进行排序:[“code”,“frame”,“framer”]。

功能说明

在下面的编辑器中完成函数 funWithAnagrams。

funWithAnagrams 有以下参数:

string text[n]:  an array of strings

退货:

string[m]:  an array of the remaining strings in ascending alphabetical order,.

限制

0 ≤ n ≤ 1000
0 ≤ m ≤ n
1 ≤ length of text[i] ≤ 1000
Each string text[i] is made up of characters in the range ascii[a-z].

自定义测试的输入格式 示例案例0

用于自定义测试的示例输入

STDIN功能


4 → n = 4 代码 → 文本 = ["代码","aaagmnrs","字谜","doce"] AAAGMNRS 字谜 多西

输出示例

aaagmnrs 代码

说明

“code”和“doce”是字谜词。删除“doce”并保留数组中第一次出现的“code”。 “aaagmnrs”和“anagrams”是字谜词。删除“anagrams”并保留数组中第一次出现的“aaagmnrs”。 按升序对剩余字符串进行排序:[“aaagmnrs”,“code”]。

def fun_with_anagrams(text: list) -> list:
    text_tuples = list(map(lambda word: ("".join(sorted(word)), word), text))
    unique_dict_of_words = {}

    for word_tuple in text_tuples:
        if word_tuple[0] not in unique_dict_of_words:
            unique_dict_of_words[word_tuple[0]] = word_tuple[1]

    words_list = list(unique_dict_of_words.values())
    return words_list


testing_texts_list = [
    ["code", "aaagmnrs", "anagrams", "doce"],
    ["listen", "silent", "enlist", "google", "gooogle"],
    ["apple", "papel", "apple", "palep", "pip"],
    ["one", "two", "three", "four", "five"],
    ["same", "same", "same", "same", "same"],
    ["a", "b", "c", "d", "e"],    ["characteristics", "catercharistis", "ricshacteristac", "charactersistic", "istcharacterrcs"],
    ["is", "si", "his", "shi", "ih"],
]

for text in testing_texts_list:
    print(fun_with_anagrams(text))

评估时间复杂度我验证这似乎是 O(m * nlogn),是否有更好的方法来降低时间复杂度?

python anagram
1个回答
0
投票

经过一番搜索,我相信这更好,因为与之前的解决方案相比,使用排序时,Counter 会降低时间复杂度。

from collections import Counter

def fun_with_anagrams_with_counter(text: list) -> list:
    unique_anagrams = {}
    result = []

    for word in text:
        counter_signature = frozenset(Counter(word).items())
        if counter_signature not in unique_anagrams:
            unique_anagrams[counter_signature] = word
            result.append(word)

    return result
© www.soinside.com 2019 - 2024. All rights reserved.