【LeetCode刷题记录】9.判定是否互为字符重排

286 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-判定是否互为字符重排

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

示例 1:

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

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

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

二、思路分析:

思路一:

  1. 将两个字符串分别转换为字符数组
  2. 对两个字符数组分别排序
  3. 再将字符数组都转换回字符串
  4. 比较转换得来的字符串是否相等

思路二:

  1. 统计每个字符串中,字符出现的次数,作为Map返回
  2. 判断每个字符在每个字符串中是否都包含,并且出现次数是否一致
  3. 如果出现次数不同,那么表示两个字符串不能够经过重新排列得到

思路三:

  1. 这是在思路二之上的一个扩展
  2. 大体思路也是比较字符的个数,但是不是使用Map,而是使用一个长度为26的数组,每个数组都是根据字母顺序排序,每个索引存储的就是排序对应字母出现的次数
  3. 最后判断两个数组是否相等即可

三、AC 代码:

思路一:

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        char[] s1Chars = s1.toCharArray();
        char[] s2Chars = s2.toCharArray();
        Arrays.sort(s1Chars);
        Arrays.sort(s2Chars);
        return new String(s1Chars).equals(new String(s2Chars));
    }
}

思路二伪代码:

 public boolean CheckPermutation(String s1, String s2) {
    //转换s1 或者 s2为字符数组
    //调用getCharCountMap()
    //循环字符数组,比较每个字符在两个Map中出现的次数是否一致
 }

 private Map<Character, Integer> getCharCountMap(String str) {
    //统计字符串每个字符出现的个数
 }

思路三伪代码:

 public boolean CheckPermutation(String s1, String s2) {
    //调用getCharCount()得到两个数组
    //循环数组,比较两个数组是否相等
 }

 private int[] getCharCount(String str) {
    //统计字符串每个字符出现的个数
 }

四、总结:

  1. 字符串直接比较肯定是行不通的,本质也就是比较字符串每个字符是否都对应存在,并且出现的次数是否相等
  2. 简历在此基础之上,就可以使用Map、数组等方式统计字符以及个数
  3. 思路三的效率相当于思路一、思路二会高一些