import java.util.Scanner; import java.util.ArrayList; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int T = in.nextInt(); while (T-- > 0) { int n = in.nextInt(); String s = in.next(); boolean hasAdjacent = false; for (int i = 0; i < n; i++) { int next = (i + 1) % n; if (s.charAt(i) == s.charAt(next)) { hasAdjacent = true; break; } } if (hasAdjacent) { System.out.println(0); continue; } boolean allUnique = true; int[] count = new int[26]; for (char c : s.toCharArray()) { if (++count[c - 'a'] > 1) { allUnique = false; } } if (allUnique) { System.out.println(-1); continue; } ArrayList<Integer>[] pos = new ArrayList[26]; for (int i = 0; i < 26; i++) { pos[i] = new ArrayList<>(); } for (int i = 0; i < n; i++) { char c = s.charAt(i); pos[c - 'a'].add(i); } int minGap = Integer.MAX_VALUE; for (int c = 0; c < 26; c++) { ArrayList<Integer> list = pos[c]; if (list.size() < 2) { continue; } int m = list.size(); for (int i = 0; i < m; i++) { int current = list.get(i); int nextPos = list.get((i + 1) % m); int diff = Math.abs(nextPos - current); int gap = Math.min(diff, n - diff); if (gap < minGap) { minGap = gap; } } } System.out.println(minGap - 1); } } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取输入的测试用例数量,并处理每个测试用例。
- 检查相邻宝石:遍历每个宝石及其下一个宝石(考虑环形),检查是否存在相邻相同的属性。
- 检查所有唯一属性:统计每个属性的出现次数,若所有属性均唯一,则直接返回-1。
- 记录位置:为每个属性记录其在字符串中的位置。
- 计算最小间隔:对于每个重复属性,计算其所有位置之间的最小间隔,并更新全局最小间隔。
- 输出结果:最小间隔减一即为需要摘掉的最少宝石数。