变位词代码识别

本文介绍了三种识别变位词的方法:逐字比较、排序比较和计数比较。逐字比较的时间复杂度为O(n^2),排序比较为O(nlogn),而计数比较为O(n)。通过这些算法,可以有效地判断两个单词是否由相同的字母组成但排列不同。
摘要由CSDN通过智能技术生成

变位词算法

一、变位词的定义

变位词:两个词之间存在组成字母的重新排列关系。
比如heart和earth,python和typhon

二、识别两个词是否为变位词

为简单起见,假设参与判断的两个词仅由小写字母构成,而且长度相等。

1.逐字比较

def anagramSolution1(s1,s2):
    '''逐字检查'''
    alist=list(s2). ##字符串是不可修改的
    pos1=0
    stillOK=True
    while pos1<len(s1) and stillOK:
        pos2=0 
        found=False
        while pos2<len(alist) and not found:
            if s1[pos1]==alist[pos2]:
                found=True
        
            else:
                pos2+=1
        if found:
            alist[pos2]=None
        else:
            stillOK=False
        pos1+=1
    return stillOK
                

时间复杂度为   O ( n 2 ) \ O(n^2)  O(n2)

2.排序比较

def anagarmSolution2(s1,s2):
    '''排序比较'''
    alist1=list(s1)
    alist2=list(s2)
    
    alist1.sort()  #在原地址排序
    alist2.sort()
    
    pos=0
    matched=True
    while pos<len(s1) and matched:
        if alist1[pos]==alist2[pos]:
            pos+=1
        else:
            matched=False
    return matched
                

或者

def bianweici2(s1,s2):
    alist1=list(s1)
    alist2=list(s2)
    alist1.sort()
    alist2.sort()
    if alist1==alist2:
        return True
    else:
        return False

时间复杂度为   O ( n log ⁡ n ) \ O(n\log n)  O(nlogn)

3.计数比较

def anagarmSolution3(s1,s2):
    '''计数比较'''
    c1=[0]*26
    c2=[0]*26
    for i in range(len(s1)):
        pos=ord(s1[i])-ord('a')
        c1[pos]+=1
    for j in range(len(s2)):
        pos=ord(s2[j])-ord('a')
        c2[pos]+=1
    j=0
    stillOK=True
    while j<26 and stillOK:
        if c1[j]==c2[j]:
            j+=1
        else:
            stillOK=False
    return stillOK        

或者

def bianweici3(s1,s2):
    c1=[0]*26
    c2=[0]*26
    for i in range(len(s1)):
        pos=ord(s1[i])-ord('a')  #ord()返回值是对应的十进制整数
        c1[pos]+=1
    for j in range(len(s2)):
        pos=ord(s2[j])-ord('a')
        c2[pos]+=1
    if c1==c2:
        return True
    else:
        return False

时间复杂度为   O ( n ) \ O( n)  O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值