开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
面试题 01.02. 判定是否互为字符重排
题目描述:
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 / 示例 1: 输入: s1 = "abc", s2 = "bca" 输出: true / 示例 2: 输入: s1 = "abc", s2 = "bad" 输出: false / 说明: 0 <= len(s1) <= 100 0 <= len(s2) <= 100
解题思路:
给定了两个字符串,要求其中一个字符串的字符重新排序后获得另一个字符。
我们可以得到的信息就是,重排前后的字符串差距在于字符排列的顺序不一样,也就是说重排前后两个字符串包含的字符是一样的。
那么我们现在需要解决的问题就转换成了:判断两个字符串中包含的字符是否完全相同。这与判断两个字符串是否互为字符重排是等价的。
为了对比两个字符串中包含的字符,我们需要先将两个字符串中包含的字符给提取出来,我通过使用String类型的toCharArray()方法,分别将两个字符串中包含的字符提取出来,组成了两个字符数组。
为了方便比较两个字符数组中的元素是否完全相同,我使用了借助了List集合。
首先遍历其中一个字符数组,将其中的元素都存放到List集合中,之后再遍历剩下一个字符数组的元素,每遍历一个元素,就使用List集合的contains()方法来判断此元素是否在集合中存在。
如果遇到遍历的元素不存在于List集合中,就代表当前字符只存在于其中一个字符串,也就是两个字符串不为字符重排,直接返回false即可。
如果存在于List集合,我们就继续遍历,但是为了不让当前元素影响后续的判断,需要删除List集合中于当前遍历字符相同的一个字符元素。这里使用到的有获取元素下标的:indexOf()方法,根据下标删除集合元素得到remove()方法。
当我们将字符串遍历完后,就可以返回true了,也说明两个字符串互为字符重排。
提交代码:
class Solution {
public boolean CheckPermutation(String s1, String s2) {
char[] S1 = s1.toCharArray(); //获取s1的字符数组S1
char[] S2 = s2.toCharArray(); //获取s2的字符数组S2
List<Character> list = new ArrayList<>(); //创建ArrayList集合
for(char a : S1){ //遍历集合S1
list.add(a); //集合元素存入数组
}
for(char a : S2){ //遍历集合S2
if(!list.contains(a)) //如果S2存在元素是S1中没有的
return false; //无法字符重排,返回false
else{ //存在对应元素
list.remove(list.indexOf(a)); //将集合集合中对应的字符删除
}
}
return true; //S1、S2所有字符都对应上,可以重排
}
}
提交结果: