LeetCode137--特殊等价字符串、仅仅反转字母

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();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值