def cut_bracelet(s: str, n: int) -> int:
if len(set(s)) == n: # 当没有重复字符时候,相当于无法断裂
return -1
if s[0] == s[n - 1]: # 当珠串首尾相连的字符相同
return 0
s_dict = {} # 用于统计每个字符的位置
for i, ss in enumerate(s):
if ss not in s_dict.keys(): # 如果之前没有统计过该字符
s_dict[ss] = [i]
else: # 如果之前统计过该字符,将该字符的位置添加进去
s_dict[ss].append(i)
min_cut_num = n - 1 # 设置摘除数量
for key, value in s_dict.items(): # key为字符,value为字符的位置
if len(value) > 1: # 因为只有宝石数量大于1的时候,才能断裂,所以数量为1的宝石可以不管
# [value[i + 1] - value[i] - 1 for i in range(len(value) - 1)]用于统计字符相邻之间的摘除数量
# [n - (value[-1] - value[0]) - 1]是从value[-1]后面的位置,value[0]前面的位置摘除时需要摘除的数量
temp_min_distance = min([value[i + 1] - value[i] - 1
for i in range(len(value) - 1)] + [n - (value[-1] - value[0]) - 1])
if temp_min_distance < min_cut_num: # 当计算的最少摘除数量小于min_cut_num时,更新min_cut_num
min_cut_num = temp_min_distance
if min_cut_num == 0: # 之前已经判断了无法破坏的情况,当如果提前遇到两个相邻的相同字符,结束并输出0
return 0
return min_cut_num
while True:
try:
n = int(input()) # 代表数据组数
res = []
for _ in range(n):
n1 = int(input()) # 代表手串初始的宝石数量
s = input()
res.append(cut_bracelet(s, n1))
print(*res, sep="\n")
except:
break