【Leecode】Leecode刷题之路第87天之扰乱字符串

news/2024/12/24 1:54:11 标签: java, leetcode, 算法

题目出处

87-扰乱字符串-题目出处

题目描述

在这里插入图片描述

个人解法

思路:

java">todo

代码示例:(Java)

java">todo

复杂度分析

java">todo

官方解法

87-扰乱字符串-官方解法

方法1:动态规划

思路:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码示例:(Java)

java">public class Solution1 {
    // 记忆化搜索存储状态的数组
    // -1 表示 false,1 表示 true,0 表示未计算
    int[][][] memo;
    String s1, s2;

    public boolean isScramble(String s1, String s2) {
        int length = s1.length();
        this.memo = new int[length][length][length + 1];
        this.s1 = s1;
        this.s2 = s2;
        return dfs(0, 0, length);
    }

    // 第一个字符串从 i1 开始,第二个字符串从 i2 开始,子串的长度为 length,是否和谐
    public boolean dfs(int i1, int i2, int length) {
        if (memo[i1][i2][length] != 0) {
            return memo[i1][i2][length] == 1;
        }

        // 判断两个子串是否相等
        if (s1.substring(i1, i1 + length).equals(s2.substring(i2, i2 + length))) {
            memo[i1][i2][length] = 1;
            return true;
        }

        // 判断是否存在字符 c 在两个子串中出现的次数不同
        if (!checkIfSimilar(i1, i2, length)) {
            memo[i1][i2][length] = -1;
            return false;
        }

        // 枚举分割位置
        for (int i = 1; i < length; ++i) {
            // 不交换的情况
            if (dfs(i1, i2, i) && dfs(i1 + i, i2 + i, length - i)) {
                memo[i1][i2][length] = 1;
                return true;
            }
            // 交换的情况
            if (dfs(i1, i2 + length - i, i) && dfs(i1 + i, i2, length - i)) {
                memo[i1][i2][length] = 1;
                return true;
            }
        }

        memo[i1][i2][length] = -1;
        return false;
    }

    public boolean checkIfSimilar(int i1, int i2, int length) {
        Map<Character, Integer> freq = new HashMap<Character, Integer>();
        for (int i = i1; i < i1 + length; ++i) {
            char c = s1.charAt(i);
            freq.put(c, freq.getOrDefault(c, 0) + 1);
        }
        for (int i = i2; i < i2 + length; ++i) {
            char c = s2.charAt(i);
            freq.put(c, freq.getOrDefault(c, 0) - 1);
        }
        for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
            int value = entry.getValue();
            if (value != 0) {
                return false;
            }
        }
        return true;
    }


}

复杂度分析

在这里插入图片描述

考察知识点

收获

Gitee源码位置

87-扰乱字符串-源码


http://www.niftyadmin.cn/n/5797209.html

相关文章

wordpress调用指定分类ID下 相同标签的内容

要在WordPress中调用分类ID为1、3、7的分类下&#xff0c;具有相同标签的前10个内容&#xff0c;可以使用自定义的WordPress查询(WP_Query)。以下是实现此功能的步骤和示例代码&#xff1a; 步骤&#xff1a; 确定共同标签&#xff1a; 首先&#xff0c;你需要确定分类1、3、…

泛型(2)

泛型&#xff08;2&#xff09; 1、泛型在继承上的体现 如果B是A的一个子类型&#xff08;子类或者子接口&#xff09;&#xff0c;而G是具有泛型声明的类或接口&#xff0c;G并不是G的子类型&#xff01; 比如&#xff1a;String是Object的子类&#xff0c;但是List并不是…

网络七层杀伤链

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

Linux SHELL脚本中的变量与运算

一.SHELL脚本中的变量 1.1.什么是变量 在编写程序时&#xff0c;通常会遇到被操作对象不固定的情况 我们需要用一串固定的字符来表示不固定的值这就是变量存在的根本意义 变量的实现原理就是内存存储单元的一个符号名称 1.2.变量的命名规则 变量的名称中只能包含数字、大…

QT_Demo(1)之实现多线程实现简单的电脑摄像头视频流开关

QT_Demo&#xff08;1&#xff09;之实现多线程实现简单的电脑摄像头视频流开关 使用qt中的多线程进行功能控制&#xff1a;继承QThread直接通过代码进行UI搭建简单示例使用信号与槽 1. 功能介绍 首先想搭一个界面可以交互&#xff0c;从而实现手动开关笔记本摄像头的目的 想…

C#经典算法面试题

网络上收集的一些C#经典算法面试题&#xff0c;分享给大家 # 递归算法 ## C#递归算法计算阶乘的方法 > 一个正整数的阶乘&#xff08;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;并且0的阶乘为1。自然数n的阶乘写作n!。1808年&#xff0c;基斯顿…

MySQL InnoDB 存储引擎详解

InnoDB 是 MySQL 中最常用、最强大的存储引擎之一&#xff0c;其支持事务、外键、行级锁等特性&#xff0c;非常适合对可靠性、并发性要求较高的场景。本文将详细解析 InnoDB 的核心特性、内部机制以及使用场景&#xff0c;帮助你更好地理解和优化 MySQL 数据库。 1. 为什么选择…

【C#】WebSoket 演示(使用websocket-sharp库)

Example 3服务器 Example1 客户端 示例3 此源代码片段包含了如何使用WebSocketSharp库来创建一个HTTP服务器&#xff0c;并提供WebSocket服务。 分析整个代码&#xff0c;我们可以归纳出以下关键信息&#xff1a; 导入了一系列重要的命名空间&#xff0c;包括系统配置、加密库…