字符串游戏
问题描述
最近,小蓝对字符串产生了浓厚的兴趣,一天,小蓝的老师给他出了一个问题,老师会给小蓝 n 个字符串,即从 S1
至Sn
,小蓝可以对其中的任意一个字符串进行如下操作:
将这个字符串的最前一位移动到最后一位。
小蓝的目标是将 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))