首页 > 其他分享 >LeetCode - #97 交错字符串

LeetCode - #97 交错字符串

时间:2024-07-17 19:27:10浏览次数:19  
标签:return String s3 s2 s1 cache 字符串 LeetCode 97

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

文章目录

前言

本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新到 96 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:中等

1. 描述

给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。

两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

s = s1 + s2 + … + sn
t = t1 + t2 + … + tm
|n - m| <= 1
交错 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …
注意:a + b 意味着字符串 a 和 b 连接。

2. 示例

示例 1

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true

示例 2

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false

示例 3

输入:s1 = "", s2 = "", s3 = ""
输出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200`
  • s1s2、和 s3 都由小写英文字母组成

3. 答案

class Solution {
   func isInterleave(_ s1: String, _ s2: String, _ s3: String) -> Bool {
       var cache = [[Int]](repeating: [Int](repeating: -1, count: s2.count), count: s1.count)
       return is_Interleave(s1, 0, s2, 0, s3, 0, &cache)
   }

   fileprivate func is_Interleave(_ s1: String, _ i: Int, _ s2: String, _ j: Int, _ s3: String, _ k: Int, _ cache: inout [[Int]]) -> Bool {
       if i == s1.count {
           return s2[j..<s2.count] == s3[k..<s3.count]
       }
       if j == s2.count {
           return s1[i..<s1.count] == s3[k..<s3.count]
       }
       if cache[i][j] >= 0 {
           return cache[i][j] == 1 ? true : false
       }

       var ans = false

       if (s3[k] == s1[i] && is_Interleave(s1, i + 1, s2, j, s3, k + 1, &cache)) ||
           (s3[k] == s2[j] && is_Interleave(s1, i, s2, j + 1, s3, k + 1, &cache)) {
           ans = true
       }
       cache[i][j] = ans ? 1 : 0

       return ans
   }
}

extension String {
   subscript (i: Int) -> Character {
       return self[index(startIndex, offsetBy: i)]
   }

   subscript(_ range: CountableRange<Int>) -> String {
       let idx1 = index(startIndex, offsetBy: max(0, range.lowerBound))
       let idx2 = index(startIndex, offsetBy: min(self.count, range.upperBound))
       return String(self[idx1..<idx2])
   }
}

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。

标签:return,String,s3,s2,s1,cache,字符串,LeetCode,97
From: https://blog.csdn.net/qq_36478920/article/details/140503387

相关文章

  • C语言中常见库函数(1)——字符函数和字符串函数
    文章目录前言1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strncmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror......
  • LeetCode-计数质数
    计数质数给定整数n,返回所有小于非负整数n的质数的数量。示例1:输入:n=10输出:4解释:小于10的质数一共有4个,它们是2,3,5,7。示例2:输入:n=0输出:0示例3:输入:n=1输出:0......
  • 字符串不会一点
    每次讲字符串杂题都发现自己忘光了。本文章用于我个人字符串专题重生。二分+哈希咕AC自动机咕SAM说文解字:SAM=SuffixAutoMation(后缀自动机)即一个可以表示字符串所有后缀的自动机。具体的,一个SAM是一个有一个确定的源点和不同终止节点的有向无环图。同时,SAM是一......
  • leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法
    leetcode145.二叉树的后序遍历,递归法+迭代法给你一棵二叉树的根节点root,返回其节点值的后序遍历。示例1:输入:root=[1,null,2,3]输出:[3,2,1]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]递归法还是一如既往的简单。postorder函数是递归函数,用......
  • 用C#写一个方法对字符串里面的字符次数排序
    namespace_7._17day01{  publicstructMyStruct  {    publicstring_name;    publicint_count;  }  internalclassProgram  {    staticvoidMain(string[]args)    {      stringstr......
  • 自己实现sprintf功能,用于把三个float转换成字符串格式,速度比sprintf快了20倍
     float转字符串使用sprintf太慢了,自己实现sprintf功能,用于把三个float转换成字符串格式,速度比sprintf快了20倍!运行结果如下图:例程:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#defineRUN_COUNT10000000//运行次数/*实现sprin......
  • LeetCode第257题:二叉树的所有路径的Java实现
    摘要LeetCode第257题要求生成二叉树的所有从根节点到叶子节点的路径。本文将介绍两种Java解决方案:迭代法和递归法。1.问题描述给定一个二叉树的根节点,按照从根到叶的顺序遍历所有路径,并将它们作为列表的列表返回。2.示例分析输入:[1,2,3,null,null,4]'输出:[[1,2],[1,......
  • 四、python字符串
    文章目录学习目标一、字符串的表示方式二、字符串的下标和切片2.1字符串的下标2.2字符串的切片三、字符串的常见操作3.1字符串运算符四、字符集和编码4.1字符集4.2编码规则五、成员运算符六、格式化打印字符串pycharm快捷键学习目标......
  • 【c语言】函数递归的一些例题1.编写一个函数,不许创建临时变量,求字符串长度 2.求n的阶
    1.intmy_strlen(char*str){   if(*str!='\0')   {      return1+my_strlen(str+1);//利用递归求字符串长度:递归一次就是多一个字符这样就可以求出字符串的长度了   }   else      return0;}intmain(){   //编写......
  • 揭秘 Java 变长参数:如何优雅地处理不定数量的字符串
    哈喽,大家好,我是木头左!理解变长参数:基础概念在Java中,变长参数也称为可变参数,它允许你传递任意数量的参数到一个方法中。这个特性是通过使用三个点符号...来实现的。当你在方法的参数列表中使用...时,任何传递给该方法的额外参数都会被当作数组来处理。这为提供了一种灵活的方式......