判定是否互为字符重排· 6 月更文挑战

83 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

示例 1:

输入: s1 = "abc", s2 = "bca" 输出: true 示例 2:

输入: s1 = "abc", s2 = "bad" 输出: false 说明:

0 <= len(s1) <= 100 0 <= len(s2) <= 100

来源:力扣(LeetCode)
链接:leetcode.cn/problems/ch…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

本题要求判断给定的两个字符串是否是重排的关系。首先,我们要正确理解重排的含义。

由于两个互为字符重排的字符串包含的字符完全相同,只有顺序可能不同,因此将两个互为字符重排的字符串排序之后,得到的有序字符串相同。只要将两个字符串排序之后比较是否相同,即可判断两个字符串是否互为字符重排

具体实现

长度不同,肯定返回false 在长度相同的情况,我们利用ASCII码的特性,对s1的每个字符计数 然后利用s2的字符数来减,如果出现小于0,说明s1和s2不能重排 如果能重排,s1和s2的字母必须相同且数量一样,顺序无所谓

也可以使用HashMap计数的方法来实现,如果一个字符串经过重新排列后,能够变成另外一个字符串,那么它们的每个不同字符的出现次数是相同的。

三、AC 代码:

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        int m = s1.length();
        int n = s2.length();
        if (m != n) {
            return false;
        }
        int[] cnt = new int[256];
        for (int i = 0; i < m; i++) {
            cnt[s1.charAt(i)]++;
        }
        for (int i = 0; i < n; i++) {
            char c = s2.charAt(i);
            cnt[c]--;
            if (cnt[c] < 0) {
                return false;
            }
        }
        return true;
    }
}

四、总结:

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助,期待您找到心意的工作和满意的offer

期待下次再见~

\