你将得到一个字符串数组 A。
每次移动都可以交换 S 的任意两个偶数下标的字符或任意两个奇数下标的字符。
如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是 特殊等价 的。
例如,S = “zzxy” 和 T = “xyzz” 是一对特殊等价字符串,因为可以先交换 S[0] 和 S[2],然后交换 S[1] 和 S[3],使得 “zzxy” -> “xzzy” -> “xyzz” 。
现在规定,A 的 一组特殊等价字符串 就是 A 的一个同时满足下述条件的非空子集:
- 该组中的每一对字符串都是 特殊等价 的
- 该组字符串已经涵盖了该类别中的所有特殊等价字符串,容量达到理论上的最大值(也就是说,如果一个字符串不在该组中,那么这个字符串就 不会 与该组内任何字符串特殊等价)
返回 A 中特殊等价字符串组的数量。
解题思路
这道题题意不清晰,看题解才知道,奇数位的字符只能和奇数位的字符交换,不能与偶数位的字符交换,反之依然,翻转之后相同即为特殊等价。
class Solution {
public int numSpecialEquivGroups(String[] A) {
Set<String> set = new HashSet<>();
//遍历A数组
for (String str : A) {
//偶数位遍历
StringBuilder sb1 = new StringBuilder();
for (int i = 0; i < str.length(); i+=2) {
//把偶数位的字符都放到sb1中
sb1.append(str.charAt(i));
}
//放到数组中,使用Arrays.sort排序
char[] ch1 = sb1.toString().toCharArray();
Arrays.sort(ch1);
//奇数位遍历
StringBuilder sb2 = new StringBuilder();
for (int i = 1; i < str.length(); i+=2) {
//把奇数位的字符都放到sb2中
sb2.append(str.charAt(i));
}
//放到数组中,使用Arrays.sort排序
char[] ch2 = sb2.toString().toCharArray();
Arrays.sort(ch2);
//相加之后放到set中,最后能set的长度就是特殊等价的数量
set.add(new String(ch1) + new String(ch2));
}
return set.size();
}
}
这道题也参考了题解。