算法程序-两个字符串是否是由颠倒字母组成

有两个字符串,如果他们中的一个是另一个的字母顺序颠倒过来,组成的字符串。那么就返回True。否则,返回False。假定两个字符串的长度相等。

比如,‘heart’和‘earth’,返回True。而“abcd”“abdd”返回False。

两种解决思路:

1.以其中的一个字符串s1为参照,另一个字符串s2放到一个list中命名为a_list,将s1中的字符拿出来和a_list中的每一个字符作比较,如果找到,那么a_list中的这个位置将设置为None。如果找不到,返回False。最终所有的都找到,才能返回True。

2.将字符串s1和s2分别用内置函数sort先进行排序。然后再一个一个字符作比较。如果有不同的,返回False。所有的字符都相同,返回True.

代码如下:

def anagram_solution1(s1,s2):
    a_list=list(s2)
    still_ok=True
    pos1=0
    count=0
    while pos1<len(s1) and still_ok:
        found=False
        pos2=0
        while pos2<len(s2) and not found:
            if s1[pos1]==a_list[pos2]:
                found=True
                a_list[pos2]=None
            else:
                pos2+=1
            count+=1
        if found==False:
            still_ok=False
        else:
            pos1+=1
    return still_ok

def anagram_solution2(s1,s2):
    a_list=list(s1)
    b_list=list(s2)
    a_list.sort()
    b_list.sort()
    pos=0
    still_ok=True
    while pos<len(s1) and still_ok:
        if a_list[pos]==b_list[pos]:
            pos+=1
        else:
            still_ok=False
    return still_ok
    

if __name__=="__main__":
    s1="abcd"
    s2="adbc"
    print(anagram_solution1(s1,s2))
    print(anagram_solution2(s1,s2))

运行结果:

>>> 
 RESTART: D:\Program Files\Python\test\algorithms\data structure and problem solving by python\1-anagram.py 
True
True

方法1的算法复杂度:


方法2的算法复杂度:

因为Python的sort方法的复杂度是O(N的平方)或者O(nlgn)。所以方法2的算法复杂度不是O(n)。而是O(N的平方)或者O(nlgn)


方法3:

检测两个字符串中每个字母的数量。分别给每个字符串分配一个长度为26的列表,存放相应字母的数量。最后比较这两个列表是否相同。

def anagram_solution3(s1,s2):
    ch1=[0]*26
    ch2=[0]*26
    for i in range(len(s1)):
        pos=ord(s1[i])-ord('a')
        ch1[pos]+=1
    for i in range(len(s2)):
        pos=ord(s1[i])-ord('a')
        ch2[pos]+=1
    matches=True
    j=0
    while j<26 and matches:
        if ch1[j]==ch2[j]:
            j+=1
        else:
            matches=False
    return matches

ord()以一个字符(长度为1的字符串)作为参数,返回对应的ASCII数值.


方法3的算法复杂度O(n)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值