[leetcode] 97. Interleaving String

知识图谱表示学习 TransE: Translating Embeddings for Modeling Multi-relational Data 知识图谱表示学习 TransE: Translating Embeddings for Modeling Multi-relational Data 表示学习是深度学习的基础,将数据用更有效的方式表达出来,才能让深度学习发挥出更强大的作用。表示学习避免了手动提取数据特征的繁琐,允许计算机学习特征的同时,也学习如何提取特征。尽管举例基于翻译(translation)的知识图谱表示学习已经过去了五六年的时间,但是仍不可忽略其重要意义。本文聚焦于TransE模型。 1. 引言 多元关系数据(Multi-relat 阅读详情

Interleaving String

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

Example 1:

Input: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
Output: true

Example 2:

Input: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
Output: false

解法1:动态规划

构造一个二维数组,dp[i][j]表示字符串到位置i和字符串s2到位置j能组成s3
dp[0][0]=1;
当i=0时,dp[i][j] = dp[i][j-1] && s2[j-1] == s3[j-1];
当j=0时,dp[i][j] = dp[i-1][j] && s1[i-1] == s3[i-1];
否则:dp[i][j] = (dp[i-1][j] && s1[i-1]==s3[i+j-1]) || (dp[i][j-1] && s2[j-1]==s3[i+j-1]);

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        if(s1.size()+s2.size() != s3.size()) return false;
        int n1=s1.size(),n2=s2.size();
        vector<vector<bool>> dp(n1+1,vector<bool>(n2+1));
        for(int i=0;i<=n1;i++){
            for(int j=0;j<=n2;j++){
                if(i==0 && j==0)
                    dp[i][j] = 1;
                else if(i==0)
                    dp[i][j] = dp[i][j-1] && s2[j-1] == s3[j-1];
                else if(j==0)
                    dp[i][j] = dp[i-1][j] && s1[i-1] == s3[i-1];
                else
                    dp[i][j] = (dp[i-1][j] && s1[i-1]==s3[i+j-1]) || (dp[i][j-1] && s2[j-1]==s3[i+j-1]);
            }
        }
        return dp[n1][n2];
    }
};

解法2:DFS

使用一个hashmap来记录匹配失败的情况,存的值为key=i*s3.size()+j来表示一对(i,j);
i表示s1当前的位置,j表示s2当前的位置。
当i=s1.size;判断s2剩余的部分和s3剩余部分是否相等;
当j=s2.size;判断s1剩余的部分和s3剩余部分是否相等;
否则,如果s1[i]==s3[k] 调用递归函数helper(s1,i+1,s2,j,s3,k+1,s))
或者s2[j]==s3[k],helper(s1,i,s2,j+1,s3,k+1, s)
把匹配失败的key加入到hashmap中。

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        if(s1.size()+s2.size() != s3.size()) return false;
        unordered_set<int> s;
        return helper(s1, 0, s2, 0, s3, 0, s);
    }
    
    bool helper(string s1, int i, string s2, int j, string s3,int k, unordered_set<int>& s){
        int key = i * s3.size() + j;
        if (s.count(key)) return false;
        if(i==s1.size()) return s2.substr(j) == s3.substr(k);
        if(j==s2.size()) return s1.substr(i) == s3.substr(k);
        if((s1[i]==s3[k] && helper(s1,i+1,s2,j,s3,k+1,s)) || (s2[j]==s3[k] && helper(s1,i,s2,j+1,s3,k+1, s)))
            return true;
        s.insert(key);
        return false;
    }
};

解法3:BFS

用一个队列来辅助BFS,循环 queue 中元素个数的次数,在 for 循环中,对队首元素进行解码,得到i和j值,
如果i小于 n1,说明 s1 还有剩余字符,如果 s1 当前字符等于 s3 当前字符,那么把 s1 的下一个位置 i+1 跟j一起加码算出 key 值,如果该 key 值不在于集合中,则加入集合,同时加入队列 queue 中;
同理,如果j小于 n2,说明 s2 还有剩余字符,如果 s2 当前字符等于 s3 当前字符,那么把 s2 的下一个位置 j+1 跟i一起加码算出 key 值,如果该 key 值不在于集合中,则加入集合,同时加入队列 queue 中。
for 循环结束后,k自增1。最后如果匹配成功的话,那么 queue 中应该只有一个 (n1, n2) 的 key 值,且k此时等于 n3,所以当 queue 为空或者k不等于 n3 的时候都要返回 false,

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        if(s1.size()+s2.size() != s3.size()) return false;
        int n1=s1.size(),n2=s2.size(),n3=s3.size();
        unordered_set<int> s;
        queue<int> q;
        q.push(0);
        int i=0,j=0,k=0;
        while(!q.empty() && k<n3){
            int len = q.size();
            for(int t=0;t<len;t++){
                i = q.front() / n3;
                j = q.front() % n3; 
                q.pop();
                if (i < n1 && s1[i] == s3[k]) {
                    int key = (i + 1) * n3 + j;
                    if (!s.count(key)) {
                        s.insert(key);
                        q.push(key);
                    }
                }
                if (j < n2 && s2[j] == s3[k]) {
                    int key = i * n3 + j + 1;
                    if (!s.count(key)) {
                        s.insert(key);
                        q.push(key);
                    }
                }
            }
            k++;
        }
        return !q.empty() && k == n3;
    }
};

参考

https://www.cnblogs.com/grandyang/p/4298664.html

图解LeetCode97:Interleaving String 文章目录理解题意解决方法一:最简单解法解决方法二:动态规划代码实现总结 Leetcode算法系列将详细讲解一些经典的面试算法题。 今天的题目是个人非常喜欢的一个,题目的名字叫做“Interleaving String”,这个题目是什么意思呢?   理解题意 Interleaving 从字面上讲是交错交叉的意思,给定两个字符串s1:"a"和s2:“b”,那么对于s3:"ab"我们说s3是s... 阅读详情

相关推荐

中微8S6990外设开发实战:从GPIO配置到低功耗休眠的完整指南

本文提供了中微8S6990增强型8051单片机从GPIO配置到低功耗休眠的完整实战指南。详细讲解了开发环境搭建、GPIO灵活配置、定时器中断、ADC采样优化、PWM电机控制等核心外设的编程要点与避坑技巧,并重点阐述了实现超低功耗休眠的系统性外设管理策略,帮助开发者快速上手并优化产品续航。

weixin_29162439的博客 533

java redis 工具类_GitHub - pengbin7/RedisUtil: 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本...

RedisUtil介绍最全的Java操作Redis的工具类,封装了对Redis五种基本类型的各种操作,力求符合Redis的原生操作,使用StringRedisTemplate实现!解惑很多人提出疑问“为什么没有操作Object的方法?”,请看这里介绍redistemplate和stringredistemplate。用法一、keys相关命令NO方法描述1void delete(String key...

weixin_39751195的博客 477

ADB详细(从下载安装到灵活运用)

ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载ADB Kits。

LiuYong_01的博客 10万+

Mentor Graphics Exemplar.Leonardo.Spectrum.v2002a 1CD

Mentor Graphics Exemplar.Leonardo.Spectrum.v2002a 1CD Mentor.Graphics.FloVENT.v10.1.Update1.Win32_64 2CD(建筑通风仿真软件) Mentor.Graphics.FloVIZ.v10.1.Win32_64 2CD(独立的仿真结果动态后处理软件) Mentor.Graph

muyufeifei91的专栏 4万+

从MIPS汇编到C语言:手把手教你用Mars模拟器理解指令集(附实战代码)

本文详细介绍了如何使用Mars模拟器从MIPS汇编过渡到C语言编程,通过实战代码解析ADD、LW、BEQ等指令集与C语言结构的对应关系。内容涵盖环境搭建、算术运算、内存访问、条件分支及函数调用等核心概念,帮助读者深入理解MIPS指令分类和计算机底层运行机制。

weixin_26821003的博客 357

从3D相机数据到三维模型:Halcon实战深度图、亮度图与点云转换全流程

本文详细解析了如何利用Halcon将3D相机采集的深度图、亮度图转换为三维点云模型的完整流程。通过实战案例分享,涵盖数据格式处理、点云生成方法(SDK接口与纯Halcon实现)、三维模型可视化优化等关键技术,帮助工程师解决工业检测中的实际难题,提升三维重建精度与效率。

weixin_42525005的博客 396

python 列表 & 元组

1.列表 1.1列表特点 1. 可存放多个值 2.按照从左到右的顺序定义列表元素,从0开始顺序访问,有序 3.可修改指定索引位置对应的值,可变 1.2列表的增加 >>> names ['nis', 'chaopeng'] >>> names.append("rain") >>> names.append("eva") >>> names ['nis', 'chaopeng', 'rain', 'eva'] 1.3列表

wanchaopeng的博客 12万+

P4语言实战:如何用Barefoot Tofino实现自定义网络协议(避坑指南)

本文是一份详尽的P4语言实战指南,重点讲解如何利用Barefoot Tofino可编程交换芯片实现自定义网络协议。内容涵盖从P4编程模型解析、自定义协议头定义,到匹配-动作流水线构建、性能优化及生产环境部署的全过程,并特别分享了在资源管理、字节序、调试技巧等方面的宝贵避坑经验,旨在帮助网络开发者和研究人员掌握数据平面编程的核心能力。

echo99的专栏 640

Leetcode-97 Interleaving String

Leetcode-97 Interleaving StringquestionGiven s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.For example, Given: s1 = “aabcc”, s2 = “dbbca”,When s3 = “aadbbcbcac”, return true

zhangwj0101的博客 297

python入门:Anaconda和Jupyter notebook的安装与使用

一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学包,方便立即开始处理数据 管理包 anaconda是在conda(一个包管理器和环境管理器)上发展来的;而conda可以很方便地对第三方的包进行安装、卸载和更新。 管理环境 conda可以为不同的项目建立不同的运行环境,避免不同的项目或包版本

PY洋洋 1万+

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 34

LeetCode力扣之97. Interleaving String

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.For example,Given:s1 = "aabcc",s2 = "dbbca",When s3 = "aadbbcbcac", return true.When s3 = "aadbbbaccc", return false.packag...

LeeWei 344

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1398

LeetCode97—Interleaving String

LeetCode97—Interleaving String

上善若水 813

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LeetCode 97. Interleaving String

97. Interleaving StringGiven s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.For example, Given: s1 = “aabcc”, s2 = “dbbca”,When s3 = “aadbbcbcac”, return true. When s3 = “aa

mingjc的博客 399

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LeetCode 97. Interleaving String

题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aadbbcbcac", return true. When s3 = "aadbbba

xclfafa的博客 384

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Leetcode 97. Interleaving String

Leetcode 97. Interleaving String Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Example 1: Input: s1 = &amp;quot;aabcc&amp;quot;, s2 = &amp;quot;dbbca&amp;quot;, s3 = &amp;quot;aadbbcbcac&amp;quot; Out

wyxwyx469410930的博客 405

Leetcode 97 Interleaving String

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aadbbcbcac", return true. When s3 = "aadbbbaccc", ret

无名山丘,崛起成峰 1万+

LeetCode 97. Interleaving String 题解

LeetCode 97. Interleaving String 题解题目描述 Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aad

Guo15331092的博客 461

[leetcode] 97 Interleaving String

问题描述: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aadbbcbcac", return true. When s3 = "aadbbbaccc

追梦船的专栏 583

【Leetcode】97. Interleaving String

题目地址: https://leetcode.com/problems/interleaving-string/ 给定三个字符串s1s_1s1​,s2s_2s2​和s3s_3s3​,则s1s_1s1​和s2s_2s2​可以通过交错的方式生成一个新字符串s′s's′,”交错的方式“的含义是,可以以插空的方式,将s1s_1s1​中的字符插到s2s_2s2​的字符之间,生成一个新的字符串,但s1s_1s1​的各个字符在新字符串中的相对顺序不能变。问s3s_3s3​能否由s1s_1s1​和s2s_2s2​这样交错生

数学、算法爱好者的博客 210

leetcode【97】Interleaving String

问题描述 Givens1,s2,s3, find whethers3is formed by the interleaving ofs1ands2. 题目意思就是给定三个字符串s1,s2和s3,判断s3能否由s1,s2交叉组成。 思路分析 用一个动态规划的方法,顶一个二维的bool类型的数组dp,dp[i][j]表示s3的前i+j个字符能否由s1的前i个字符和s2的前j...

fanyuwgy的博客 219

leetcode 97 Interleaving String(python)

python leetcode 97 Interleaving String

快递小可的博客 1334

LeetCode 97(Interleaving String)Java

原题:Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. 给定3个字符串,判断s3是否可以由s1和s2交错组成; 例如:s1="aa",s2="bc",s3="abca";s3可以由s1和s2交错组成; 思路:很多字符串问题某一位置的解会与它上一位置的解有关,这种情

Jassy1994的博客 581
上一篇: [leetcode] 87. Scramble String
下一篇: [leetcode] 115. Distinct Subsequences
Peng_maple
博客等级 码龄10年 0粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值