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
二、思路分析:
思路一:
- 将两个字符串分别转换为字符数组
- 对两个字符数组分别排序
- 再将字符数组都转换回字符串
- 比较转换得来的字符串是否相等
思路二:
- 统计每个字符串中,字符出现的次数,作为Map返回
- 判断每个字符在每个字符串中是否都包含,并且出现次数是否一致
- 如果出现次数不同,那么表示两个字符串不能够经过重新排列得到
思路三:
- 这是在思路二之上的一个扩展
- 大体思路也是比较字符的个数,但是不是使用Map,而是使用一个长度为26的数组,每个数组都是根据字母顺序排序,每个索引存储的就是排序对应字母出现的次数
- 最后判断两个数组是否相等即可
三、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) {
//统计字符串每个字符出现的个数
}
四、总结:
- 字符串直接比较肯定是行不通的,本质也就是比较字符串每个字符是否都对应存在,并且出现的次数是否相等
- 简历在此基础之上,就可以使用Map、数组等方式统计字符以及个数
- 思路三的效率相当于思路一、思路二会高一些