刷题的日常-判定是否互为字符重排

101 阅读2分钟

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

刷题的日常-2022年10月22号

一天一题,保持脑子清爽

判定是否互为字符重排

来自leetcode的 面试题 01.02 题,题意如下:

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

示例1:

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

示例2:

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

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出两个字符串
  • 要求我们判断两个字符串是否是重排的关系,即所有的字符都能够匹配,但是顺序可能不一样
  • 长度也要匹配

做题思路

从题意可以看出来,要匹配字符串,前提长度是要一样的,并且字符串中的字符也是要完全包含,相同字符出现的字数也应该要完全相同才行。
第一种解法是用Map进行操作,先统计两个字符串中字符出现的个数,然后扫描Map,如果两个map中的数量或者具体字符的数量不一致,则返回false即可,否则返回true
这里我没有用map,我们知道,字符其实是通过某种规则进行编码的,底层可以用int来表示,所以可以对字符进行排序,通过排序,两个字符串的字符就会以编码的顺序进行排列,这样我们就可以直接往后扫描然后进行简单匹配即可,如果出现不匹配的情况,返回false。

代码实现

代码实现如下,因为需要进行排序,所以时间复杂度为O(nlogn):

public class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if (s1.length() != s2.length()) {
            return false;
        }
        char[] s1c = s1.toCharArray(), s2c = s2.toCharArray();
        Arrays.sort(s1c);
        Arrays.sort(s2c);
        for (int i = 0; i < s1c.length; i++) {
            if (s1c[i] != s2c[i]) {
                return false;
            }
        }
        return true;
    }
}