【Java算法题 14-1】 LeetCode(思路详细,注释齐全) - 面试题 01.02. 判定是否互为字符重排

119 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情

面试题 01.02. 判定是否互为字符重排

原题链接:面试题 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所有字符都对应上,可以重排
    }
}

提交结果

在这里插入图片描述