python实现完美数匹配问题

完美数匹配问题

在这里插入图片描述在这里插入图片描述

题目分析

这里面我们是要在原串中,匹配完美数的排列,从而筛选出是否有符合完美数的特征。

这里,我的思路就是,先匹配完美排列的外观值,如果C数组中,匹配到了,那么就开始判断匹配到的外观值对应的玩具价格是否和完美排列的一致。如果一致,那么就输出这个完美排列在C中的起始位置。不然就输出0。

当然,为了减小时间复杂度,我们还是采用剪枝的思想。就是排除掉一些没有必要的循环。

剪枝

  1. 如果flag为1了,那么直接返回,结束函数
  2. 如果完美组合已经遍历完了,那么我们就直接结束函数

代码


def NumInout():
    """
    @:param K: 完美排列的长度
    @:param A: 完美排列的外观
    @:param B: 完美排列的价值
    @:param N: 玩具总数
    @:param C: 玩具的外观值
    @:param D: 玩具的价值
    :return:
    """
    global K,A,B,C,D,N
    K = int(input())
    A = input().split()
    B = input().split()
    N = int(input())
    C = input().split()
    D = input().split()

def DFS(pIndex,cIndex):
    """
    :param pIndex:记录的是完美排列的下标
    :param cIndex:C数组的下标
    :return:
    """
    global flag,indexE

    # 如果下标加2已经超了,说明没有匹配到的了。
    if cIndex != 0 and A[pIndex] != C[cIndex]:
        pIndex = 0
        return False


    # flag被设置成了1,就没有继续查下去的必要了。
    if flag == 1:
        return indexE

    # 如果完美组合已经被查完了,那么就直接结束
    if pIndex >=2:
        flag = 1
        indexE = cIndex-2
        return indexE

    for i in range(cIndex,len(C)):
        if A[pIndex] == C[i]:
            if pIndex == 2:
                break
            DFS(pIndex+1,i+1)
        else:
            pIndex = 0


if __name__ == '__main__':
    flag = 0
    pIndex = 0
    NoneFlag = 0
    NumInout()
    DFS(pIndex, cIndex=0)
    while True:
        if flag == 1:
            # 这里就是查看匹配到的字符串中的价值是否等于完美排列的价值
            if ''.join(B) == ''.join(D[indexE:indexE+K]):
                break
            # 如果不是,那么我们就让flag为0,然后,继续深搜。
            flag = 0
            # 如果说,我们要搜的起始长度已经超了的话,就直接跳出循环了。
            if indexE + 3 > len(C):
                NoneFlag = 1
                break
            DFS(0,indexE+3)

        else:
            print(0)
            break
    if NoneFlag == 1:
        print(0)
    else:
    	print(indexE+1)

这里我用的是DFS的思路,通过循环让dfs不断地在不同的地方寻找一条路径。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值