首页 > 其他分享 >递归_字符串匹配,最长连续序列

递归_字符串匹配,最长连续序列

时间:2024-10-06 12:49:02浏览次数:12  
标签:字符 递归 序列 length num input 字符串 article match

1:字符串匹配

题目链接:LCR 137. 模糊搜索验证 - 力扣(LeetCode)

可以使用递归的方法来检查 input 是否可以匹配 article。目的是正确处理两种通配符:‘.’ 和 ‘*’的匹配规则。

def is_match(article: str, input: str) -> bool:
    if not input:
        return not article
    first_match = bool(article) and (input[0] == article[0] or input[0] == '.')
    if len(input) >= 2 and input[1] == '*':
        return (is_match(article, input[2:]) or
                (first_match and is_match(article[1:], input)))
    else:
        return first_match and is_match(article[1:], input[1:])

以下是对该代码的详细解释:

def is_match(article: str, input: str) -> bool:
  • 定义一个函数 is_match,它接受两个字符串参数:article 和 input。这个函数的目标是确定 input 是否可以匹配 article。函数返回一个布尔值。
    if not input:
        return not article
  • 检查 input 是否为空。如果 input 为空,那么只有当 article 也为空时,才能匹配成功。因此,返回 not article。如果 article 也为空,返回 True,表示匹配成功;否则返回 False
    first_match = bool(article) and (input[0] == article[0] or input[0] == '.')
  • 初始化一个布尔变量 first_match。它表示 input 的第一个字符是否与 article 的第一个字符匹配。匹配的条件是 input 的第一个字符等于 article 的第一个字符,或者 input 的第一个字符是通配符 ‘.’(可以匹配任意单个字符)。
    if len(input) >= 2 and input[1] == '*':
  • 检查 input 的长度是否至少为2,并且 input 的第二个字符是否是通配符。如果这两个条件都满足,那么我们可以选择忽略 '’ 和它前面的字符,或者尝试将 ‘*’ 前面的字符与 article 中的字符进行匹配。
        return (is_match(article, input[2:]) or
                (first_match and is_match(article[1:], input)))

如果 input 的第二个字符是 ‘*’,我们有两种选择:

  1. 忽略 ‘*’ 和它前面的字符,并递归地检查 input[2:](即 input 中去掉前两个字符)是否可以匹配 article
  2. 如果 first_match 为 True(即 input 的第一个字符与 article 的第一个字符匹配),我们可以尝试将 ‘*’ 前面的字符与 article 中的字符进行匹配,并递归地检查 input 是否可以匹配 article[1:](即去掉 article 第一个字符的字符串)。

这两种选择中只要有一种是 True,就返回 True

    else:
        return first_match and is_match(article[1:], input[1:])
  • 如果 input 的第二个字符不是 ‘*’,那么我们只需要检查 input 的第一个字符是否与 article 的第一个字符匹配(即 first_match 是否为 True),并且递归地检查 input[1:] 是否可以匹配 article[1:]。如果这两个条件都满足,返回 True;否则返回 False

2:最长连续序列

题目链接:128. 最长连续序列 - 力扣(LeetCode)

这个题目的目的是找到输入数组中数字连续的最长序列的长度。可以通过将数组转换为集合,能够以 O(1) 的时间复杂度来检查一个数字是否存在,从而使得整个算法的时间复杂度为 O(n)。

def longest_consecutive(nums):
    if not nums:
        return 0

    num_set = set(nums)
    max_length = 0
   
    for num in num_set:
        # 检查当前数字 num 是否是一个序列的开始。这是通过检查 num - 1 是否在集合中来确定的。如果 num - 1 不在集合中,那么 num 就是一个序列的开始。
        if num - 1 not in num_set:
            length = 1
            # 使用一个 while 循环来检查从 num 开始的连续数字是否在集合中。如果 num + length 在集合中,则将 length 增加 1,并继续检查下一个连续数字。
            while num + length in num_set:
                length += 1
            # 更新 max_length 为 max_length 和 length 中的较大值。这确保了 max_length 总是记录着找到的最长连续序列的长度。
            max_length = max(max_length, length)

    return max_length

3:有效的数独

题目链接:36. 有效的数独 - 力扣(LeetCode)

首先初始化三个集合列表:rowscols 和 boxes,分别用于存储每一行、每一列和每一个 3x3 宫内的数字。然后,遍历整个数独板,检查每个数字是否已经在相应的行、列或宫中出现过。如果出现过,则返回 False;否则,将数字添加到相应的集合中。如果整个数独板都检查完毕且没有发现冲突,则返回 True

def is_valid_sudoku(board):
    # 初始化9个集合,分别代表9行、9列和9个3x3宫,用于存储出现的数字
    rows = [set() for _ in range(9)]
    cols = [set() for _ in range(9)]
    boxes = [set() for _ in range(9)]

    # 遍历数独板的每一个位置
    for i in range(9):
        for j in range(9):
            # 获取当前位置的数字
            num = board[i][j]
            # 如果当前位置不是空白格(即不是'.')
            if num != '.':
                # 计算当前数字属于哪一个3x3宫
                box_index = (i // 3) * 3 + j // 3

                # 检查当前数字是否已经在当前行、当前列或当前宫出现过
                if num in rows[i] or num in cols[j] or num in boxes[box_index]:
                    # 如果出现过,则数独无效,返回False
                    return False

                # 将当前数字添加到当前行、当前列和当前宫的集合中
                rows[i].add(num)
                cols[j].add(num)
                boxes[box_index].add(num)

    # 如果所有位置都检查完毕且没有冲突,则数独有效,返回True
    return True

标签:字符,递归,序列,length,num,input,字符串,article,match
From: https://blog.csdn.net/2301_80651329/article/details/142717338

相关文章

  • 题解:P11008 『STA - R7』异或生成序列
    Solution序列\(p\)是\(1\)~\(n\)的排列,因此考虑搜索回溯。由\(\sumn\le2\times10^6\)得知\(O(n^2)\)会炸,深感遗憾但仍考虑剪枝。坚信深搜过百万的蒟蒻。。。原\(b\)序列为长度\(n-1\)的序列:{\(b_1,b_2,b_3\cdotsb_n-1\)}将其前面插入一个元素\(......
  • 经典递归
    master公式所有子问题规模相同的递归才能用master公式:T(n)=a*T(n/b)+O(n^c),a、b、c为常数若log(b,a)<c,复杂度为O(n^c),log(b,a)是以b为底a的对数若log(b,a)>c,复杂度为O(n^log(b,a))若log(b,a)=c,复杂度为O(n^c*logn)T(n)=2*T(n/2)+O(n*longn),时间复杂度为O(n*(lo......
  • 序列化对象输出
    publicclassSerializableObj{publicstaticvoidmain(String[]args){ObjectOutputStreamoos=null;try{//1.创建ObjectOutputStream输出流oos=newObjectOutputStream(newFileOutputStream("D:\\doc\\person.ba......
  • 序列化器ser.validated_data、ser.initial_data、ser.data
    1.ser.data示例:在视图中返回序列化后的数据returnResponse(serializer.data)2.ser.validated_dataifserializer.is_valid():validated_data=serializer.validated_data3.ser.initial_data原始数据4.示例:classLoginPwdSerializer(serializers.Serializer):m......
  • 浅谈 $prufer$ 序列
    \(purfer\)序列,是为了证明\(cayley\)定理。具体来说,是将一个树映射到一个数组上,在数组上可以使得很多东西更加清晰的展示。构造\(prufer\)序列\(prufer\)是将一个大小为\(n\)的树映射到长度\(n-2\)的序列上。从一个无根树开始,我们将树入度为\(1\)的点找出来,及叶子......
  • 字符函数和字符串函数和内存函数
    strtok函数原型与功能概述在C语言中,strtok函数的原型为char*strtok(char*str,constchar*delim)。它的主要功能是将字符串str按照delim中指定的分隔符进行分割,返回被分割出来的子字符串。工作原理首次调用:当第一次调用strtok时,需要将待分割的字符串str作为第一个参数传入。st......
  • 找到字符串中第一个匹配项的下标(c语言)
    1./给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回 -1。//示例1://输入:haystack="sadbutsad",needle="sad"//输出:0//解释:"sad"在下标0和6处匹......
  • 【题解】B - 三元上升子序列
    目录题目内容DescriptionInputOutput数据规模与约定思路代码题目内容DescriptionErwin最近对一种叫thair的东西巨感兴趣。。。在含有\(n\)个整数的序列\(a_1,a_2,\ldots,a_n\)中,三个数被称作thair当且仅当\(i\ltj\ltk\)且\(a_i\lta_j\lta_k\)。求一个序列中thair......
  • java 反序列化 cc6 复现
    复现环境:common-collections版本<=3.2.1,java版本随意.我们观察java高于8u71的版本会发现sun.reflect.annotation.AnnotationInvocationHandler类被进行了修改,其中的readObject不去调用setvalue方法,而是创建了一个LinkedHashMapvar7去重新进行操作,使我们之前的利用链中断.p......
  • Leetcode 1498. 满足条件的子序列数目
    1.题目基本信息1.1.题目描述给你一个整数数组nums和一个整数target。请你统计并返回nums中能满足其最小元素与最大元素的和小于或等于target的非空子序列的数目。由于答案可能很大,请将结果对109+7取余后返回。1.2.题目地址https://leetcode.cn/problems/num......