持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}