✧判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = “abc”, s2 = “bca”
输出: true
示例 2:
输入: s1 = “abc”, s2 = “bad”
输出: false
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
解题思路:
① s1和s2不一样长肯定不能重排
② s1和s2不能为空
③ s1假设=aabbc,s2假设=bbacc,也就是说s1中包含s2的单个字符,但其实每个字符重复次数不一样导致不能重排,(难点,解决方式用Map集合)
正确解法:
map1.getOrDefault(char1[i],0)+1:意味着,如果集合内由此键值对,则使用集合里的key--value+1,如果没有则存入一份key--0+1(value),依次记录字符重复次数
public class Algo02 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
System.out.println(checkString(s1, s2));
}
private static boolean checkString(String s1,String s2) {
char[] char2 = s2.toCharArray();
char[] char1 = s1.toCharArray();
if(s1.length()!=s2.length()){
return false;
}
if(s1==null||s1.length()==0||s2==null||s2.length()==0){
return false;
}
//记录重复出现次数
Map<Character,Integer> map1=new HashMap<>();
Map<Character,Integer> map2=new HashMap<>();
for (int i = 0; i < char1.length; i++) {
//存在字符则+1
map1.put(char1[i], map1.getOrDefault(char1[i],0)+1);
map2.put(char2[i], map2.getOrDefault(char2[i],0)+1);
}
if(!map1.equals(map2)){
return false;
}
return true;
}
}
错误解法:
此种解法会疏漏aaab 和bbba 这种情况
//错误解法
public static boolean CheckPermutation(String s1, String s2) {
char[] chars = s2.toCharArray();
if(s1.length()!=s2.length()){
return false;
}
if(s1==null||s1.length()==0||s2==null||s2.length()==0){
return false;
}
for (int i = 0; i < chars.length; i++) {
if(!s1.contains(String.valueOf(chars[i]))){
return false;
}
}
return true;
}