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