完美数匹配问题
题目分析
这里面我们是要在原串中,匹配完美数的排列,从而筛选出是否有符合完美数的特征。
这里,我的思路就是,先匹配完美排列的外观值,如果C数组中,匹配到了,那么就开始判断匹配到的外观值对应的玩具价格是否和完美排列的一致。如果一致,那么就输出这个完美排列在C中的起始位置。不然就输出0。
当然,为了减小时间复杂度,我们还是采用剪枝的思想。就是排除掉一些没有必要的循环。
剪枝
- 如果flag为1了,那么直接返回,结束函数
- 如果完美组合已经遍历完了,那么我们就直接结束函数
代码
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不断地在不同的地方寻找一条路径。