题目
给定两个字符串 s1
和 s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
解题
方法一:排序
思路
如果字符串长度不同则返回 false
,把两个字符串排序后对比每一个字符,如果不同返回 false
,全部相同返回 true
。
代码
class Solution {
public boolean CheckPermutation(String s1, String s2) {
int n = s1.length();
if (n != s2.length()) return false;
char[] chs1 = s1.toCharArray();
char[] chs2 = s2.toCharArray();
Arrays.sort(chs1);
Arrays.sort(chs2);
for (int i = 0; i < n; ++i) {
if (chs1[i] != chs2[i]) return false;
}
return true;
}
}
方法二:哈希表
思路
如果字符串长度不同返回 false
,维护一个哈希表,枚举第一个字符串的字符在哈希表中计数增加,枚举第二个字符串中的字符在哈希表中计数减少,如果小于 0 则不可能达成字符串重排的条件返回 false
。
代码
class Solution {
public boolean CheckPermutation(String s1, String s2) {
if (s1.length() != s2.length()) return false;
Map<Character, Integer> map = new HashMap<>();
for (char ch : s1.toCharArray()) map.put(ch, map.getOrDefault(ch, 0) + 1);
for (char ch : s2.toCharArray()) {
int cnt = map.getOrDefault(ch, 0);
if (cnt <= 0) return false;
map.put(ch, cnt - 1);
}
return true;
}
}
评论区