// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432 // 题目等价于求给定循环字符串中的相同字母间的最小间距 // 循环字符串可以把字符串 *= 2,不过此处没有这样 #include <climits> #include <iostream> #include <vector> using namespace std; void solve(){ int n; cin >> n; string s; cin >> s; vector<int> a[26];//--------记录相同字母在字符串中的索引用于计算间距 for (int i = 0; i < n; i++){ a[s[i] - 'a'].push_back(i); } int ans = INT_MAX; for (int i = 0; i < 26; i++){ if (a[i].empty()) continue; int size = a[i].size(); for (int j = 0; j < size - 1; j++){ ans = min(ans, a[i][j + 1] - a[i][j] - 1);//-------如有最短间距,则必然在相邻的之间 } if (size > 1){//--------考虑首尾 ans = min(ans, a[i][0] + n - a[i][size - 1] - 1); } } if (ans != INT_MAX) cout << ans << endl; else cout << -1 << endl; } int main() { int T; cin >> T; while(T--){ solve(); } } // 64 位输出请用 printf("%lld")