<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)97:交錯(cuò)字符串

          共 537字,需瀏覽 2分鐘

           ·

          2020-11-18 01:44

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?交錯(cuò)字符串,我們先來看題面:

          https://leetcode-cn.com/problems/interleaving-string/

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


          An interleaving of two strings s and t is a configuration where they are divided into non-empty substrings such that:


          s = s1 + s2 + ... + sn

          t = t1 + t2 + ... + tm

          |n - m| <= 1

          The interleaving is s1 + t1 + s2 + t2 + s3 + t3 + ... or t1 + s1 + t2 + s2 + t3 + s3 + ...

          Note: a + b is the concatenation of strings a and b.

          題意


          給定三個(gè)字符串 s1、s2、s3,請你幫忙驗(yàn)證 s3 是否是由 s1 和 s2 交錯(cuò) 組成的。

          兩個(gè)字符串 s 和 t 交錯(cuò) 的定義與過程如下,其中每個(gè)字符串都會被分割成若干 非空 子字符串:

          s = s1 + s2 + ... + sn
          t = t1 + t2 + ... + tm
          |n - m| <= 1
          交錯(cuò) 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...
          提示:a + b 意味著字符串 a 和 b 連接。

          樣例


          解題

          https://my.oschina.net/u/3640932/blog/4405751


          動(dòng)態(tài)規(guī)劃

          這個(gè)問題我們可以轉(zhuǎn)換為求證,s3 是否能夠從向下選取 s1,向右選取 s2,這樣的形式,去求得是否存在 s3 這條路徑。

          狀態(tài)定義

          設(shè)?dp[i][j]?表示 s1 前 i 個(gè)字符和 s2 前 j 個(gè)字符能夠拼接成 s3(i+j) 個(gè)字符,也就是當(dāng)前路徑存在。

          狀態(tài)轉(zhuǎn)移方程

          如果 s1 的第 i 個(gè)元素和 s3 的第 i+j 個(gè)元素相等,那么?dp[i][j]?是否成立,則需要看?dp[i-1][j]?是否成立,也就是這里需要看 s1 的前 i-1 個(gè)元素和 s2 的前 j 個(gè)元素能否拼接成 s3 的前 i+j-1 個(gè)元素。
          同樣的 如果 s2 的第 j 個(gè)元素和 s3 的第 i+j 個(gè)元素相等,此時(shí)?dp[i][j]?是否成立,則需要看?dp[i][j-1]?是否成立,也就是需要看 s2 的前 i 個(gè)元素和 s2 的前 j-1 個(gè)元素是否能夠拼接成 s3 的前 i+j-1 個(gè)元素。
          那么最終的狀態(tài)轉(zhuǎn)移方程為:
          dp[i][j] = (dp[i-1][j] and s3[i+j-1]=s1[i-1]) or (dp[i][j-1] and s3[i+j-1]=s2[j-1])

          狀態(tài)初始化

          • dp[0][0] = True

          • 如果 j = 0, dp[i][0] 是否成立,取決于 dp[i-1][0] 以及 s1 的第 i 個(gè)字符是否等于 s3 的第 i 個(gè)字符;

          • 如果 i = 0, dp[0][j] 是否成立,取決于 dp[0][j-1] 以及 s3 的第 i 個(gè)字符與 s2 的第 i 個(gè)字符是否相等。

          class Solution:
          ????def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
          ????????# 先處理特殊情況,如果 s1 和 s2 的長度和不等于 s3 的長度,則返回 False。因?yàn)闊o法交錯(cuò)拼接
          ????????if?len(s1) + len(s2) != len(s3):
          ????????????return?False
          ????????
          ????????m?= len(s1)
          ????????n = len(s2)

          ????????# 狀態(tài)定義
          ????????dp?= [[False] * (n+1) for?_ in range(m+1)]
          ????????# 初始化
          ????????dp[0][0] = True
          ????????for?i in range(1, m+1):
          ????????????dp[i][0] = dp[i-1][0] and?s3[i-1] == s1[i-1]
          ????????for?j?in range(1, n+1):
          ????????????dp[0][j] = dp[0][j-1] and?s3[j-1] == s2[j-1]

          ????????for?i in range(1, m+1):
          ????????????for?j?in range(1, n+1):
          ????????????????dp[i][j] = (dp[i-1][j] and?s3[i+j-1]==s1[i-1]) or?(dp[i][j-1] and?s3[i+j-1]==s2[j-1])

          ????????return?dp[-1][-1]


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。


          上期推文:

          LeetCode50-80題匯總,速度收藏!
          LeetCode刷題實(shí)戰(zhàn)81:搜索旋轉(zhuǎn)排序數(shù)組 II
          LeetCode刷題實(shí)戰(zhàn)82:刪除排序鏈表中的重復(fù)元素 II
          LeetCode刷題實(shí)戰(zhàn)83:刪除排序鏈表中的重復(fù)元素
          LeetCode刷題實(shí)戰(zhàn)84:?柱狀圖中最大的矩形
          LeetCode刷題實(shí)戰(zhàn)85:最大矩形
          LeetCode刷題實(shí)戰(zhàn)86:分隔鏈表
          LeetCode刷題實(shí)戰(zhàn)87:擾亂字符串
          LeetCode刷題實(shí)戰(zhàn)88:合并兩個(gè)有序數(shù)組
          LeetCode刷題實(shí)戰(zhàn)89:格雷編碼
          LeetCode刷題實(shí)戰(zhàn)90:子集 II
          LeetCode刷題實(shí)戰(zhàn)91:解碼方法
          LeetCode刷題實(shí)戰(zhàn)92:反轉(zhuǎn)鏈表 II
          LeetCode刷題實(shí)戰(zhàn)93:復(fù)原IP地址
          LeetCode刷題實(shí)戰(zhàn)94:二叉樹的中序遍歷
          LeetCode刷題實(shí)戰(zhàn)95:不同的二叉搜索樹 II
          LeetCode刷題實(shí)戰(zhàn)96:不同的二叉搜索樹

          瀏覽 22
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV乱码久久久久 | 久热在线 | AExXxX国产 | 午夜福利10000 | 无码蜜桃 吴梦梦 |