蓝桥杯练习题 python 字符串游戏

通过暴力枚举和deque高效操作,解决将给定字符串序列变一致的问题,计算并输出最小操作次数。若无法达成目标,返回None。
摘要由CSDN通过智能技术生成

字符串游戏

问题描述

最近,小蓝对字符串产生了浓厚的兴趣,一天,小蓝的老师给他出了一个问题,老师会给小蓝 n 个字符串,即从 S1Sn ,小蓝可以对其中的任意一个字符串进行如下操作:

将这个字符串的最前一位移动到最后一位。

小蓝的目标是将 n 个字符串变成一致的,他可以进行任意次数的操作,请问他所要进行操作的最小次数是多少,若无法完成目标则返回 None

输入格式

第一行输入包含一个整数 n 代表接下来有 n 个字符串,接下来 n 行输入 n 个字符串 。

输出格式

若能完成目标则返回一个整数代表操作的最小次数,若不能则打印 None

样例输入

3
sadfg
dfgsa
fgsad

样例输出

4

思路

暴力枚举,因为数据比较小,暴力枚举也不会超时。
将n个将每个元素都作为最优解,以一个列表保存,最后再输出最小结果

Deque 可以从队列 两端添加 (append) 和 弹出 (pop) 元素,且两个方向的 时间复杂度均为 O(1) 。虽然 list 对象也支持类似操作,但 list 在开头插入 insert(0, item) 或弹出 (pop(0)) 元素的时间复杂度均为 O(n)。

import sys
from copy import deepcopy
from collections import deque
n = int(input())
lit = []
for i in range(n):
    lit.append(deque(input()))
x = []

for c in range(n):
    lis = deepcopy(lit)
    goal = lis[c]
    count = 0

    for i in range(n):
        for j in range(len(lis[c])):
            if lis[i] == goal:
                break
            new = lis[i].popleft()
            lis[i].append(new)
            count += 1
        if lis[i] != goal:
            print(None)
            sys.exit()
    x.append(count)
print(min(x))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值