算法小知识-----9.28----- 判定是否互为字符重排

87 阅读2分钟

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

距离周末还有2天,那么也就是说距离国庆还有两天,起飞了

判定是否互为字符重排

该题出自力扣的面试题 01.02. 判定是否互为字符重排 —— 简单题

审题

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

  • 输入: s1 = "abc", s2 = "bca"
  • 输出: true
  • 输入: s1 = "abc", s2 = "bad"
  • 输出: false
  • 该题的题意相当简单,简直就是一行概括,给出两个字符串,确定两个字符串内的构造是否一致,不考虑顺序
  • 那么既然是简单题,有许多的方法可以判断
    • 直接排序
      • 直接对两个字符串进行Arrays.sort
      • 字符串的排序,会采用字典序的排序方法,但不管最终怎么排,对于字符串的主体顺序规则都是一样的
      • 最后直接采用equal方法去比较就行了
    • HashMap
      • 可以采用HashMap方法,对字符串的出现次数进行归纳
      • 整体最粗暴的解法就是遍历三次,第一次遍历收集字符串1的出现次数,第二次遍历匹配字符串2的出现次数并减1,第三次遍历hashMap,直接找是否有还未使用的字符串1
    • 数组优化
      • 由于HashMap的底层其实也是数组 + 链表,那么直接使用数组来实现就可以了
      • 先判断两个字符串的长度是否一致,不一致直接剪枝
      • 猜测题型只有字母字符串(小写),开辟26个字母的数组
      • 循环字符串长度,如果字母未出现过,则次数 + 1,字符串2亦一样
      • 最后返回变量

编码

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if (l1 != l2)return false;
        int[] a = new int[26];
        int tol = 0;
        for (int i = 0; i < l1; i++) {
            if (++a[s1.charAt(i) - 'a'] == 1)tol++;
            if (--a[s2.charAt(i) - 'a'] == 0)tol--;
        }
        return tol == 0;
    }
}

image.png