大致题意:给你n个字符串,问你有多少个非同构字符串,两个字符串同构当且仅当通过循环移位之后能表示成同一字符串。
思路:一个比较优美的解决方法是首先求出每个串的最小表示,然后借助map判断该最小表示字符串是否出现过即可。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Map<String, Boolean> map = new HashMap<>();
while (in.hasNext()) {
int ans = 0;
map.clear();
int n = in.nextInt();
for (int i = 0; i < n; i++) {
String s = in.next();
String str = getMin(s);
if (!map.containsKey(str)) {
ans++;
map.put(str, true);
}
}
System.out.println(ans);
}
}
private static String getMin(String s) {
int n = s.length();
int i = 0, j = 1, k = 0, t;
while (i < n && j < n && k < n) {
int d = s.charAt((i + k) % n) - s.charAt((j + k) % n);
if (d == 0)
k++;
else {
if (d > 0) i += k + 1;
else j += k + 1;
if (i == j) j++;
k = 0;
}
}
if (i > j) i = j;
return s.substring(i) + s.substring(0, i);
}
}