Python 我在字谜中对单词进行分组的时间超过了,还有其他方法吗

Python 我在字谜中对单词进行分组的时间超过了,还有其他方法吗,python,string,hashtable,anagram,Python,String,Hashtable,Anagram,上述代码在馈送时为: class Solution: # @param {string[]} strs # @return {string[][]} def isAnagram(self, s, t): s1 = [];s2 = [] s1[:0] = s s2[:0] = t s1.sort();s2.sort() if s1 == s2: return True else: return False def gr

上述代码在馈送时为:

class Solution:
# @param {string[]} strs
# @return {string[][]}
def isAnagram(self, s, t):
    s1 = [];s2 = []
    s1[:0] = s
    s2[:0] = t
    s1.sort();s2.sort()
    if s1 == s2:
        return True
    else:
        return False
def groupAnagrams(self, strs):
    l=[]
    for i in strs:
        m=[]
        if m not in m:
            m.append(i)
            for j in strs:
                if self.isAnagram(i,j)==True:
                    m.append(j)
                    strs.remove(j)
        l.append(m)
    return l
显示了这个错误。
我是python新手,所以我无法跨越这一关。谢谢:)

您的代码似乎有一些问题

  • 如果m不在m中:
    这行没有多大意义
  • strs.remove(j)
    在迭代列表时永远不要从列表中删除,否则会发生不好的事情
  • 您正在将每个字符串与其他字符串(包括字符串本身)进行比较
因此,对于您的
[“吃”、“茶”、“晒”、“吃”、“纳特”、“蝙蝠”]
示例,您的代码返回
[[“吃”、“吃”、“吃”]、[“晒”、“晒”]、[“蝙蝠”、“蝙蝠”]

关于性能,最大的问题似乎是,每次将字符串与任何其他字符串进行比较时,您都在对这些字符串进行排序,即,总的来说,您排序了n2次!相反,我建议您使用字典将字符串映射到它们的排序版本

["shuffled","lacquered","efficacious","michigander","corruptness","internals","converter","speeds","rebellion","transceivers","electroencephalogram","crematories","bespoken","complainant","flotations","nev","blindfolding","corresponds","optionally","aggravating","gratifying","healthfulness","characterizing","dole","fantasies","bulks","responsibly","exploiting","confluences","header","dunno","saddam","adulate","spoken","bargained","funiculars","enlargements","mastered","expended","zambians","muggiest","riveted","junketing","shrewish","issachar","wallpapered","bridges","efficacious","cogitation","parabola","inheres","song","chock","surfing","windy","richer","shields","rehash","autobiographical","idiotic","discipline","keyword","proliferation","hollower","exposing","britain","fred","salarying","misplaying","gallbladder","czechoslovakia","burying","deprivation","lubricated","androids","hurtle","kitty","attach","subsidies","tumbled","unseemliest","impelling","surmise","blundered","etching","stuccoes","windiest","monorail","raided","comedians","theodora","muhammadans","sillies","unlocking","lubricating","desperados","vine","purposeless","calmest","loopy","confluences","clings","today","mountaineer","son","axiomatic","thur","ideograph","document","rudolf","joviality","crystals","moodiest","footprints","net","taney","crane","psycho","quantified","aisle","aimee","vegetarianism","canes","twining","butler","transporters","cohere","wilts","outlines","imbecile","passages","godunov","sunken","maneuvers","papyruses","slowed","residuals","tarpaulins","devour","callus","aldebaran","wraiths","outplay","psychoanalyst","flicking","congealing","unsteadier","smoother","bavarian","savvy","wino","tortola","stiflings","deprecation","iguassu","surnames","chit","fraud","strong","camel","undulate","jiggling","lars","singsonging","canny","someway","overtaken","sonja","rapacity","scotch","discus","spill","boated","americanized","phoneyed","nonprofessional","excessive","nuisance","haddock","fared","jibes","lintels","nurturing","falls","testimonial","pluralism","cookeries","cocksure","cassock","appraiser","contingent","barbarous","shoo","groundings","tulsa","hughes","fiver","taces","compatriot","cockpit","sepoy","naughties","topeka","decadents","rangers","topaz","kr","accoladed","palmed","jackknifes","overbore","blintze","shari","corroborations","mortgagees","tylenol","rockies","caesar","estimations","disconnects","coordinating","satinwood","octopus","smithsonian","dustiness","subscript","compacting","sanctuary","restarting","palmist","johnie","winos","conurbations","contrived","crumby","demavend","blooding","electrodes","composed","wheres","clements","ululate","basketball","cattlemen","callus","toolboxes","harelips","garaged","fuller","stubborn","scald","devotion","revolvers","kernels","lean","adversaries","floe","uninvited","umiaks","crackup","molested","santiago","contraltos","bethany","exhortations","preferential","gina","processor","beleaguering","fountainhead","politicking","denounces","eats","zodiacs","lubricated","prisoning","chautauqua","apparently","apiaries","lawrence","ellis","vampired","falsifiable","shaker","impecuniousness","maurice","vaginas","fran","cobain","angkor","discernment","numbs","bridges","novelette","renumbering","multiplicand","gluey","tots","garment","outran","disrespects","chino","pennsylvania","puff","chilly","roosted","fuses","concede","unimplemented","misogynist","disheveling","wiggler","penciling","storage","thoroughbreds","copiously","unidentifiable","warpaths","detriments","wantoning","welling","philosophizes","proprietorship","crumbliest","forgather","hemlocks","evangeline","abelson","extant","hijacking","repelling","stockholder","rebuking","stagnates","mechanization","shenyang","obeisance","english","erythrocyte","marring","regenerated","spinster","pest","forgathered","projectionist","match","smolder","rhinos","libretti","astutely","recuperates","outsources","vole","maestros","viewers","imprecision","astrophysicist","aristotelian","impressing","picnicked","minimalism","commas","ladled","gobbles","aborts","ahem","lira","surreptitious","corpses","london","hallucination","hendricks","traumata","anchovy","medication","reexamine","stabilization","jackboot","insular","floated","silkier","entertains","barren","savvier","volatile","amethysts","feuds","cheddar","cogs","trinities","underpasses","whoopee","cult","housing","fussbudgets","laminated","regress","boeotian","fugitive","anthers","nebraska","torch","declassify","tijuana","badges","cohan","stylish","formosan","lifestyles","impresario","love","errata","teletypewriters","resembled","cork","weaver","darlene","preoccupied","cage","faun","reclassifies","confinements","evolution","jayne","syndicate","soaping","provincials","regional","squabble","apricot","totes","herbart","beards","carpetbagged","assignable","henpecks","coating","amplified","insulation","smooths","parliament","sahara","bursitis","lingos","wherewithal","inoffensively","overcrowds","bhutan","disarrange","zippy","flosses","parnell","erratas","sidings","clapboards","confederated","palliative","wirelesses","etruscans","neonates","clayey","vaccinating","peskiest","liable","bibliographical","squidded","hausdorff","lumberyard","blythe","pillions","fiddlesticks","sarong","scarfed","reformer","gunrunning","sweaters","entreats","wicca","tennis","quilt","canisters","frankincense","unbar","neighed","cicadas","bighorns","tittles","dimaggio","costuming","judas","paints","pastorals","carib","glamored","cantering","demotes","currying","excommunicating","thwarting","freebase","niagara","fortification","buttercups","survey","barracudas"]

示例的输出是
[['tan','nat'],['bat'],['eat','tea','ate']]

您可以这样做。在这里,我将每个单词进行散列,并绘制单词地图。具有相同哈希值的单词是字谜

def groupAnagrams(strs):
    res = {}
    for s in strs:
        res.setdefault(''.join(sorted(s)), []).append(s)
    return res.values()

我假设您正在某种托管/教育环境中运行代码?你能给我们一点关于你想做什么的背景知识吗(一大堆句子?),并正确地格式化你的代码(类缩进看起来不合适)?例如,给定:[“吃”、“茶”、“晒”、“吃”、“吃”、“吃”、“茶”],[“吃”、“晒”],[“拍”]]我们需要一个输出:[“吃”、“吃”、“茶”],[“nat”、“晒”],[“拍”]你的代码有问题吗(就耗时而言)是将每个字符串与其他字符串进行比较。因此,如果有1000个字符串,它将进行1000*1000(=1000000)比较。这称为“N平方阶”或“O(N^2)”,这意味着它将非常快地变得非常慢。您需要更改算法,以便不需要所有这些比较。提示:也许可以考虑将每个字符串预处理为一个“否”,但不会这样做,一旦它找到其字谜,我会将其从原始列表中删除,但如果大多数单词不是彼此的字谜呢?
import collections


def sort_prehash(word):
    return ''.join(sorted(word))  

def group_anagrams(words, hash_function):
    result = {}
    for w in words:
        s = hash_function(w.lower())
        if s in result:
            result[s] |= {w}
        else:
            result[s] = {w}
    return result.values()

orig = ["eat", "tea", "tan", "ate", "nat", "bat"]

print group_anagrams(orig, sort_prehash)