首页 > 其他分享 >三、变位词判断

三、变位词判断

时间:2024-01-29 11:25:21浏览次数:21  
标签:26 判断 变位 s2 s1 pos c1

变位词判断

所谓的变位词,是指两个词之间存在组成字母的重新排列关系
如heart, earth, python,typhon
简单起见,假设参与判断的两个词仅有小写字母构成,且长度相等
解题目标:写一个bool函数,以两个词作为参数,返回这两个词是否变位词

解法1:

将词1中的字符逐个到词2去检查是否存在,存在就打勾,防止重复检查,如果每个字符都能找到,则两个词是变位词,只要有一个字符找不到,就不是变位词。

我的写法:

def check_in_01(character1, character2):
    if len(character1) == len(character2):
        length = len(character1)
        for i in character1:
            if i in character2:
                print(f"{i}存在")
            else:
                print(f"{i}不存在")
                break
    else:
        print("请输入字符相同的两个字符串")


check_in_01('earth', 'hearl')   #我的写法的数量级其实和下面的一样
def anagramSolution(s1, s2):
    alist = list(s2)  # 复制s2到列表alist    python的字符串是不可变类型,要转成列表
    pos1 = 0  # s1的下标位置
    stikkOK = True  # 是否变位词的标记
    while pos1 <len(s1) and stikkOK:
        pos2 = 0  # s2的下标位置
        found = False  # 是否找得到的标记,找到则found为ture
        while pos2 < len(alist) and not found:
            if s1[pos1] == alist[pos2]:   # s1的抽出每个字符,该字符和s2的每个字符逐个对比
                found = True   # 是否能找得到的标记
            else:
                pos2 = pos2 + 1
        if found:
            alist[pos2] = None  # 如果s1的字符在s2中能找到,那么这个字符在s2中变成None
        else:
            stikkOK =False
        pos1 =pos1 + 1
    return stikkOK

分析算法的复杂度
主要部分在于两重循环,总执行次数=1+2+3...+n (如果是变位词,最多需执行这么多次) 即 n(n+1)/2=1/2(n^2) + 1/2*n
数量级位O(n^2)级

解法2:先排序再比较

将两个字符串都按照字母的顺序排好序,再逐个对比是否相同

def anagramSolution2(s1, s2):
    alist1 = list(s1)   # python的字符串是不可变类型,要转成列表
    alist2 = list(s2)

    alist1.sort()
    alist2.sort()
    pos = 0
    matches = True
    while pos < len(s1) and matches:
        if alist1[pos] == alist2[pos]:
            pos = pos + 1
        else:
            matches = False
        return matches

print(anagramSolution2('abcde', 'acedb'))

算法分析
最多执行n次,数量级是O(n)
但前面的两个sort并不是无代价的。
排序的算法运行时间的数量级差不多是O(n^2)或者O(n log n),大过循环的O(n)
本算法的运行时间数量级就等于排序过程的数量级O(n log n) !

解法3:暴力解法

穷尽所有可能的组合
将s1中出现的字符进行全排列,再查看s2是否出现再全排列中
这里最大的困难是产生s1所有字符的全排列
根据组合数学的结论,如果n个字符进行全排列,其可能的字符串的个数位n! (n的阶乘)

如过是20个字符串,每微秒处理一个,需要近8万年的时间

暴力法恐怕不能算是个好算法

解法4:计数比较

解题思路:对比两个词中每个字母出现的次数,如果26个个字母出现的次数都相同的话,这两个字符串一定就是变位词
具体做法:为每个词设置一个26为的计数器,先检查每个词,在计数器中设定好每个字母出现的次数
次数完成后,进入比较阶段,看两个字符串的计数器是否相同,如果相同则输出是变位词的结论
为每个词做一个计数器

def anagramSolution03(s1, s2):
    c1 = [0] * 26
    c2 = [0] * 26
    for i in range(len(s1)):
        pos = ord(s1[i]) - ord('a')   # ord用来返回一个字符的unicode编码的,编码是连续的,如果s[i]和a这个字符编码差pos=0,表示s[i]就是a
        c1[pos] = c1[pos] + 1          # 那么s[i]这个字符的计数器的位置就是c1[pos],在c1列表的第一位,计数器+1,所以c1[pos]的值要加1,第一位表示为a,计数为1
    for i in range(len(s2)):
        pos = ord(s2[i]) - ord('a')
        c2[pos] = c2[pos] + 1
    j = 0
    stillOK = True
    while j < 26 and stillOK: # 一共26个字母
        if c1[j] == c2[j]:
            j = j+1
        else:
            stillOK = False
    return stillOK

print(anagramSolution03('apple', 'pleap'))

算法分析
有3个循环迭代,但不存在嵌套循环
总操作次数T(n) = 2n+26,其数量级为O(n)
本算法依赖与两个长度为26的计数器列表,比前三个算法需要更多的存储空间,如果是中文,需要更多的存储空间
以空间换时间,时间和空间之间的取舍和权衡,在算法的选择和编程的设计经常存在。
可以把计数器改成字典的形式

标签:26,判断,变位,s2,s1,pos,c1
From: https://www.cnblogs.com/jessie98654/p/17975087

相关文章

  • 如何判断鹏城实验室的启智平台上的项目是否靠谱呢?
    国外的AI搞的如火如荼,而国内呢?好像除了在发论文的数量上可以和美国拼一拼,好像其他方面上都不太行。这里就以鹏城实验室为例。启智平台是鹏城实验室推出的产品,可以说这上面的项目绝大部分都不太靠谱,而且那些即使是带有组织背景的也不太行,这里就给出个例子:下面给出一个东北大学的一个......
  • 无涯教程-Swift - 条件判断
    件判断结构要求程序员根据一个或多个要条件判断,如果条件为true时要执行的一个或多个语句,否则执行其它语句。以下是在大多数编程语言中找到的典型决策结构的概述-Swift4提供以下类型的决策声明。单击以下链接以查看其详细信息。Sr.NoStatement&描述1ifstatementif语......
  • 通达信趋势判断指标公式源码副图
    来势线:EMA(CLOSE,7)-EMA(CLOSE,21),COLORYELLOW;福星:EMA(来势线,7),COLORSTICK,COLORRED;VAR1:=CLOSE/REF(LLV(LOW,35),5)<1;决策:IF(VAR1,0.5,0),STICK,COLORBLUE;必买:IF(TROUGHBARS(3,15,1)=0ANDHIGH>LOW+0.01,1,-1),COLORYELLOW,LINETHICK1;必卖:IF(PEAKB......
  • C++教程——初识c++(循环,判断,跳转语句)
    在程序设计中,循环语句的使用十分重要,不同的需求需要用到不同的循环语句,对各种循环语句的熟练使用是学好程序设计的关键。接下来就来介绍循环语句及其使用。对于while循环来说,注意判断条件的使用,do...while语句要注意,它至少会执行一次do中的代码块,这是需要注意到的,对于for循环来说,括......
  • STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing viola
    1.什么是STA?     STA(静态时序分析)是时序验证的一种方法,用于计算和分析电路是否满足时序约束的要求。 2.为什么需要STA?    电路能否正常工作,其本质上是受最长逻辑通路(即关键路径)的限制,以及受芯片中存储器件的物理约束或工作环境的影响。    为了保......
  • java 判断数组类型
    Java判断数组类型在Java中,数组是一种特殊的数据结构,可以存储多个相同类型的元素。当我们处理数组时,有时候需要判断数组的类型,以便进行相应的操作。本文将介绍几种判断数组类型的方法,并提供相应的代码示例。1.使用instanceof运算符Java中的instanceof运算符用于判断一个对......
  • java 判断数字在某个区间的语法
    Java判断数字在某个区间的语法介绍区间判断语法if语句switch语句示例代码总结介绍在Java编程中,经常需要判断一个数字是否在某个区间内。例如,判断一个学生成绩是否及格,判断一个年龄是否在合法范围等。本文将介绍Java中判断数字在某个区间的语法,并给出相应的代码示例。......
  • java 判断经纬度是否在国内
    判断经纬度是否在国内1.流程图flowchartTDA(开始)B(获取经纬度)C(检查纬度范围)D(检查经度范围)E(判断是否在国内)F(结束)A-->BB-->CC-->DD-->EE-->F2.代码实现步骤步骤1:获取经纬度首先,我们需要获取经纬度的数值。可以通过以下代码获取:doublela......
  • js根据地区判断进行跳转页面
    <script>//获取访问者的IP地址functiongetVisitorIP(){returnnewPromise((resolve,reject)=>{constxhr=newXMLHttpRequest();xhr.open('GET','https://ipinfo.io/json',true);xhr.onload=func......
  • Python基础语法:代码规范、判断语句与循环语句
    Python是一种高级、动态类型的编程语言,其语法清晰、简洁,易于学习。本文将介绍Python基础语法中的代码规范、判断语句和循环语句。一、代码规范良好的代码规范可以提高代码的可读性和可维护性。在Python中,有一些常见的代码规范建议:使用有意义的变量名。变量名应该清晰地描述变量的用......