1、特殊等价字符串(L893)
//你将得到一个字符串数组 A。 // // 每次移动都可以交换 S 的任意两个偶数下标的字符或任意两个奇数下标的字符。 // // 如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是 特殊等价 的。 // // 例如,S = "zzxy" 和 T = "xyzz" 是一对特殊等价字符串,因为可以先交换 S[0] 和 S[2],然后交换 S[1] 和 S[3],使得 // "zzxy" -> "xzzy" -> "xyzz" 。 // // 现在规定,A 的 一组特殊等价字符串 就是 A 的一个同时满足下述条件的非空子集: // // // 该组中的每一对字符串都是 特殊等价 的 // 该组字符串已经涵盖了该类别中的所有特殊等价字符串,容量达到理论上的最大值(也就是说,如果一个字符串不在该组中,那么这个字符串就 不会 与该组内任何字符串特 //殊等价) // // // 返回 A 中特殊等价字符串组的数量。 // // // // // // // 示例 1: // // 输入:["abcd","cdab","cbad","xyzz","zzxy","zzyx"] //输出:3 //解释: //其中一组为 ["abcd", "cdab", "cbad"],因为它们是成对的特殊等价字符串,且没有其他字符串与这些字符串特殊等价。 //另外两组分别是 ["xyzz", "zzxy"] 和 ["zzyx"]。特别需要注意的是,"zzxy" 不与 "zzyx" 特殊等价。 // // // 示例 2: // // 输入:["abc","acb","bac","bca","cab","cba"] //输出:3 //解释:3 组 ["abc","cba"],["acb","bca"],["bac","cab"] // // // // // 提示: // // // 1 <= A.length <= 1000 // 1 <= A[i].length <= 20 // 所有 A[i] 都具有相同的长度。 // 所有 A[i] 都只由小写字母组成。 // // Related Topics 字符串
这里直接构成一个大小为52的数组,分别用于存储大写字母和小写字母的个数,然后把这个数组转成字符串,用HashSet进行存储,然后返回set的尺寸。
public int numSpecialEquivGroups(String[] A) {
Set<String> seen = new HashSet();
for (String S: A) {
int[] count = new int[52];
for (int i = 0; i < S.length(); ++i)
count[S.charAt(i) - 'a' + 26 * (i % 2)]++;
seen.add(Arrays.toString(count));
}
return seen.size();
}
2、仅仅反转字母(L917)
//给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。 // // // // // // // 示例 1: // // 输入:"ab-cd" //输出:"dc-ba" // // // 示例 2: // // 输入:"a-bC-dEf-ghIj" //输出:"j-Ih-gfE-dCba" // // // 示例 3: // // 输入:"Test1ng-Leet=code-Q!" //输出:"Qedo1ct-eeLg=ntse-T!" // // // // // 提示: // // // S.length <= 100 // 33 <= S[i].ASCIIcode <= 122 // S 中不包含 \ or " // // Related Topics 字符串
遍历字符串,一旦遇到字母就从后面拿,一旦遇到非字母字符就直接用。
public String reverseOnlyLetters(String s) {
StringBuilder sb_a = new StringBuilder(s);
StringBuilder sb_b = new StringBuilder();
int l = sb_a.length() - 1;
for (int i = 0; i < sb_a.length(); i++) {
if(!Character.isLetter(sb_a.charAt(i))){
sb_b.append(sb_a.charAt(i));
}else{
if(Character.isLetter(sb_a.charAt(l))){
sb_b.append(sb_a.charAt(l));
}else{
while(!Character.isLetter(sb_a.charAt(l))){
l--;
}
sb_b.append(sb_a.charAt(l));
}
l--;
}
}
return sb_b.toString();
}