【Day14】LeetCode力扣(解题思路+详细注释)[面试题 01.02.判定是否互为字符重排] [62. 不同路径 ] [205. 同构字符串 ]

简介: 学习[面试题 01.02.判定是否互为字符重排] [62. 不同路径 ] [205. 同构字符串 ]。

刷题打卡,第十四天


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

题目二、62. 不同路径

题目三、205. 同构字符串


题目一、面试题 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


解题思路:

给定了两个字符串,要求其中一个字符串的字符重新排序后获得另一个字符。


换个角度来思考,只需要两个字符串的字符能一致即可,我们将两个字符串转化为字符数组,一个数组存入集合。


遍历另一个数组的字符,同时与集合中的元素进行比较,比较到不一致的直接返回false,比较到一致的,删除集合中对应元素,继续遍历。


直到遍历完所有字符,集合元素也归零后,说明可以字符重排,返回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所有字符都对应上,可以重排
    }
}

提交结果:

微信图片_20221030165030.png


题目二、62. 不同路径


原题链接:62. 不同路径


题目描述:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。


机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。


问总共有多少条不同的路径?

/


示例 1:


输入:m = 3, n = 7

输出:28

/

示例 2:

输入:m = 3, n = 2

输出:3

解释:

从左上角开始,总共有 3 条路径可以到达右下角。

向右 -> 向下 -> 向下

向下 -> 向下 -> 向右

向下 -> 向右 -> 向下

/

示例 3:

输入:m = 7, n = 3

输出:28

示例 4:

输入:m = 3, n = 3

输出:6


解题思路:

类似于爬楼梯问题,依旧是用动态规划的思路:

我们遍历网格的第一行和第一列,给第一行和第一列赋值上一个路径,每到一个网格,只需要考虑其上位置和左位置的路径数量。

移动到最后终点时,累计的路径数便是总路径数目。


提交代码:

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] step = new int[m][n]; //创建m×n网络
        for(int i = 0;i < m;++i){     //给第一列赋值一个路径
            step[i][0] = 1;
        }
        for(int i = 0;i < n;++i){     //给第一行赋值一个路径
            step[0][i] = 1;
        }  
        for(int i = 1;i < m;++i){     //动态规划地将前面两个位置存在路径累加起来
            for(int j = 1;j < n;++j){
                step[i][j] =step[i-1][j] + step[i][j-1] ;
            }
        }
        return step[m-1][n-1];        //返回抵达终点的所有路径
    }
}


提交结果:

微信图片_20221030165042.png


题目三、205. 同构字符串


原题链接:205. 同构字符串


题目描述:


给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1

输入:s = “egg”, t = “add”

输出:true

示例 2:

输入:s = “foo”, t = “bar”

输出:false

示例 3:

输入:s = “paper”, t = “title”

输出:true


解题思路:

使用Map集合来存放键值对,遍历集合中的键值对,当出现于之前存在的键值对起冲突的情况,就代表无法重构了。具体看注释:


提交代码:

class Solution {
    public boolean isIsomorphic(String s, String t) {
        //使用Map集合来存储映射关系
        Map <Character,Character> s2t = new HashMap<Character,Character>();
        Map <Character,Character> t2s = new HashMap<Character,Character>();
        //获取字符串的字符长度
        int length = s.length();
        char x,y;
        for(int i = 0;i < length; ++i){//遍历
        //分别遍历两个字符串,取相同位置的字符
            x = s.charAt(i);
            y = t.charAt(i);
            //两个集合的键值对分别反向存储两个取得的字符
            //在不断遍历过程中,如果发现新的键值对与已存在的键值对的关系不同,就代表不能同构了
            if(s2t.containsKey(x)&&s2t.get(x)!=y||t2s.containsKey(y)&&t2s.get(y)!=x){return false;}
            //两个集合的键值对分别反向存储两个取得的字符
            s2t.put(x,y);
            t2s.put(y,x);
        }
        return true; //若两个集合键值对没有发生冲突,返回真
    }
}

提交结果:

微信图片_20221030165050.png


⚽求关注⚽ 作者🥇 .29. 🥇 的✔博客主页✔

⚽来刷题⚽ 记录每日LeetCode✔刷题专栏✔

您的点赞,收藏以及关注是对作者最大的鼓励喔 ~~



目录
相关文章
|
3月前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
30 0
|
3月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
116 0
Leetcode第三题(无重复字符的最长子串)
|
3月前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
34 0
|
3月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
23 0
|
5月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
5月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
5月前
|
算法
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
5月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
56 4
|
5月前
|
存储 Python
【Leetcode刷题Python】滑雪路径消耗时间:Testing Round #16 (Unrated) C. Skier
Leetcode题目"Testing Round #16 (Unrated) C. Skier"的Python解决方案,题目要求计算给定滑雪路径字符串的总耗时,其中未走过的边耗时5秒,走过的边耗时1秒。
59 4
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!