LeetCode 97. Interleaving String

简介: 给定s1,s2,s3,确定s3是否由s1和s2的交织形成,若是返回True,若不是则返回False.

v2-37856ccdef2a66f36b53a5390fcc2c18_1440w.jpg

Description



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


描述



给定s1,s2,s3,确定s3是否由s1和s2的交织形成,若是返回True,若不是则返回False.


思路



  • 交织形成的意思是:不断的从s1和s2中交替的取出一些字符(数量随机)构成一个新的字符,若当s1和s2都取完了且此时的新字符串与s3相等,说明s3可以由s1和s2交织形成,否则不可以交织形成.
  • 此题目使用动态规划.
  • 动态规划适用于求解 判断是否能够满足条件(返回布尔值)类型的题 和 求解满足条件解的个数(返回个数,不要求返回每种解的具体情况)类型的题.
  • 我们维护一个二维矩阵matrix[m][n],m = len(s1),n = len(s2).
  • 每一个位置的值取决于:
  • 以下说明索引从1开始:
  1. 当前位置的上一个位置为True:说明 s2[1:col] + \s1[1:row-1] 可以构成s3[1:row+col-1]的字符,于是我们取s1[row],如果当前字符与s3[row+col-1]相等,于是s2[1:col]+\s1[1:row-1] 可以构成s3[1:row+col]的字符,当前位置设为True.
  2. 当前位置的左一个位置为True:说明s1[1:row] + s2[1:col-1] 可以构成s3[1:row+col-1]的字符,于是我们取s2[col],如果当前字符与s3[row+col-1]相等,于是s1[1:row] + s2[1:col] 可以构成s3[1:row+col]的字符,当前位置设为True.
  3. 如果上两个条件不能满足,说明当前位置是不可构成s3[1:row+col]的字符的,于是当前位置设为False.
  4. 最后返回matrix[m][n]的值.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2018-12-28 09:26:14
# @Last Modified by:   何睿
# @Last Modified time: 2018-12-28 10:23:43
from pprint import pprint
class Solution:
    def isInterleave(self, s1, s2, s3):
        """
        :type s1: str
        :type s2: str
        :type s3: str
        :rtype: bool
        """
        # 动态规划,使用二维矩阵.
        # 获取矩阵的行数和列数.
        row, col = len(s1), len(s2)
        # 如果字符串1的长度加上字符串2的长度不等于字符串3的长度
        # 则字符串3一定不可以由字符串s1和字符串s2交替构成.
        if row + col != len(s3):
            return False
        # 生成二维矩阵
        matrix = [[False for _ in range(col+1)] for _ in range(row+1)]
        # 0 0 表示从s1中取0个字符,从s2中取0个字符用来构成S3中的空字符,可以构成,则设为True.
        matrix[0][0] = True
        # 初始化第一行,当s2的当前位置与s3相等并且s2当前位置的前一串能够构成s3的字符串,设为True.
        for i in range(1, col+1):
            matrix[0][i] = True if matrix[0][i - 1] and s2[i-1] == s3[i-1] else False
        # 初始化第一列,当s1的当前位置与s3相等并且s1当前位置的前一串能够构成s3的字符串,设为True.
        for i in range(1, row):
            matrix[i][0] = True if matrix[i -1][0] and s1[i-1] == s3[i-1] else False
        for i in range(1,row+1):
            for j in range(col+1):
                # 循环遍历检查每一个位置
                # 如果当前位置的上一个位置为True,我们就尝试从s1中取出一个字符i与s3中的i+j-1比较,如果相等当前位置设为True.
                # 如果当前位置的左一个位置为True,我们就尝试从s2中取出一个字符i与s3中的i+j-1比较,如果相等当前位置设为True.
                if (matrix[i-1][j] and s1[i-1] == s3[i+j-1]) or (matrix[i][j-1] and s2[j-1] == s3[i+j-1]):
                    matrix[i][j] = True
                # 如果上一个位置为False且左一个位置为False,或者当前位置s1[i-1]与s3[i+j-1]不等且s2[j-1]与s3[i+j-1]不等,
                # 当前位置设为False
                else:
                    matrix[i][j] = False
        return matrix[row][col]
if __name__ == "__main__":
    so = Solution()
    res = so.isInterleave(s1 = "a", s2 = "b", s3 = "a")
    print(res)


源代码文件在这里.


目录
相关文章
|
10月前
|
算法 C++
【LeetCode】【C++】string OJ必刷题
【LeetCode】【C++】string OJ必刷题
56 0
|
5月前
|
机器学习/深度学习 canal NoSQL
从C语言到C++_12(string相关OJ题)(leetcode力扣)
从C语言到C++_12(string相关OJ题)(leetcode力扣)
48 0
|
5月前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
11月前
|
Java
Leetcode 467. Unique Substrings in Wraparound String
大概翻译下题意,有个无限长的字符串s,是由无数个「abcdefghijklmnopqrstuvwxy」组成的。现在给你一个字符串p,求多少个p的非重复子串在s中出现了?
46 0
|
算法 索引
【LeetCode】string 类的几道简单题
【LeetCode】string 类的几道简单题
【LeetCode】string 类的几道简单题
LeetCode 438. Find All Anagrams in a String
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100. The order of output does not matter.
85 0
LeetCode 438. Find All Anagrams in a String
|
存储
LeetCode 394. Decode String
给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
92 0
LeetCode 394. Decode String
|
索引
LeetCode 387. First Unique Character in a String
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
104 0
LeetCode 387. First Unique Character in a String
|
索引
LeetCode 345. Reverse Vowels of a String
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
97 0
LeetCode 345. Reverse Vowels of a String
|
机器学习/深度学习 NoSQL
LeetCode 344. Reverse String
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
93 0
LeetCode 344. Reverse String