給定字典形成目標字串的方法數
1639。給定字典形成目標字串的方法數
難度:難
主題:陣列、字串、動態程式設計
您將獲得一個相同長度個單字的字串清單和一個字串目標。
您的任務是根據以下規則使用給定的單字形成目標:
- 目標應從左到右形成。
- 要形成目標的第i 字元(0-索引),您可以選擇第j第k第 字元 單字中的字串,如果target[i] = Words[j][k].
- 一旦您使用了第j第 個單字字串中的第k第 個字符,您就不能再使用第x第單字中任何字串的字符,其中x
- 重複此過程,直到形成字串目標。
注意,只要滿足上述條件,您可以在單字中使用同一字串中的多個字元。
回傳從單字形成目標的方式數。由於答案可能太大,請返回模 109 7.
範例1:
- 輸入: 單字 = ["acca","bbbb","caca"], target = "aba"
- 輸出: 6
-
說明:有 6 種形成目標的方法。
- 「aba」->索引 0(「acca」)、索引 1(「bbbb」)、索引 3(「caca」)
- 「aba」->索引 0(「acca」)、索引 2(「bbbb」)、索引 3(「caca」)
- 「aba」->索引 0(「acca」)、索引 1(「bbbb」)、索引 3(「acca」)
- 「aba」->索引 0(「acca」)、索引 2(「bbbb」)、索引 3(「acca」)
- 「aba」->索引 1(「caca」)、索引 2(「bbbb」)、索引 3(「acca」)
- 「aba」->索引 1(「caca」)、索引 2(「bbbb」)、索引 3(「caca」)
範例2:
- 輸入: 單字 = ["abba","baab"], 目標 = "bab"
- 輸出: 4
-
說明:有 4 種方式形成目標。
- 「bab」->索引 0(「baab」)、索引 1(「baab」)、索引 2(「abba」)
- 「bab」->索引 0(「baab」)、索引 1(「baab」)、索引 3(「baab」)
- 「bab」->索引 0(「baab」)、索引 2(「baab」)、索引 3(「baab」)
- 「bab」->索引 1(「abba」)、索引 2(「baab」)、索引 3(「baab」)
約束:
- 1
- 1
- 單字中的所有字串都具有相同的長度。
- 1
- words[i] 和 target 只包含小寫英文字母。
提示:
- 對於每個索引 i,儲存第 i第 行中每個字元的頻率。
- 利用動態規劃,利用頻率陣列計算得到目標字串的方式數。
解:
這個問題需要找到從單字字典中形成目標字串的方法數量,遵循有關字元使用的特定規則。這是一個組合問題,可以使用動態規劃(DP)和預處理字元頻率來有效解決。
要點
-
限制:
- 單字長度相同。
- 單字中的字元只能以從左到右的方式使用。
-
挑戰:
- 由於限制條件大,有效計算形成目標的方法。
- 避免透過記憶重新計算。
-
取模:
- 由於結果可能很大,所有計算均以 109 7 為模。
接近
解決方案使用:
-
預處理:
- 計算所有單字中每個位置的每個字元的頻率。
-
動態規劃:
- 使用二維DP表計算形成目標字串的方式數。
步驟:
- 將單字預處理為頻率數組(計數)。
- 定義一個 DP 函數,使用預處理後的計數遞歸地找出形成目標的方法數。
計畫
-
輸入解析:
- 接受字詞並設定目標。
-
預處理:
- 建立一個 counts 數組,其中 counts[j][char] 表示所有單字中位置 j 處的 char 出現的頻率。
-
動態規劃:
- 使用具有記憶功能的遞歸函數來計算使用單字中有效位置的字元形成目標的方法數量。
-
回傳結果:
- 回傳總計數模 109 7.
讓我們用 PHP 實作這個解:1639。給定字典形成目標字串的方法數
<?php const MOD = 1000000007; /** * @param String[] $words * @param String $target * @return Integer */ function numWays($words, $target) { ... ... ... /** * go to ./solution.php */ } /** * Helper function for DP * * @param $i * @param $j * @param $counts * @param $target * @param $memo * @return float|int|mixed */ private function dp($i, $j, $counts, $target, &$memo) { ... ... ... /** * go to ./solution.php */ } // Example Usage $words = ["acca", "bbbb", "caca"]; $target = "aba"; echo numWays($words, $target) . "\n"; // Output: 6 $words = ["abba", "baab"]; $target = "bab"; echo numWays($words, $target) . "\n"; // Output: 4 ?>
解釋:
-
預處理步驟:
- 建構計數數組:
- 對於單字中的每一列,計算每個字元的出現次數。
- 範例:如果words = ["acca", "bbbb", "caca"],對於第一列,counts[0] = {'a': 1, 'b': 1, 'c': 1 }.
- 建構計數數組:
-
遞迴DP:
- 定義 dp(i, j):
- i 是目標中的目前索引。
- j 是單字中的目前位置。
- 基本案例:
- 如果 i == len(target):形成整個目標 → 回傳 1。
- 如果 j == len(words[0]):沒有更多列可供使用 → 傳回 0。
- 復發:
- 選項 1:使用位置 j 開始的 counts[j][target[i]] 個字元。
- 選項 2:跳過位置 j。
- 定義 dp(i, j):
-
最佳化:
- 使用記憶表來儲存重疊子問題的結果。
範例演練
輸入:
單字= [“acca”,“bbbb”,“caca”],目標=“aba”
-
預處理:
- 計數[0] = {'a': 2, 'b': 0, 'c': 1}
- 計數[1] = {'a': 0, 'b': 3, 'c': 0}
- 計數[2] = {'a': 1, 'b': 0, 'c': 2}
- 計數[3] = {'a': 2, 'b': 0, 'c': 1}
-
DP 計算:
- dp(0, 0): 從第0列開始有多少種方式組成「aba」。
- 結合使用計數和跳列進行遞歸計算。
輸出:6
時間複雜度
- 預處理:O(n x m),其中n是單字數量,m是單字長度。
- 動態規劃:O(l x m),其中l是目標的長度。
- 總計:O(n x m l x m)。
範例輸出
- 輸入: 單字= [“acca”,“bbbb”,“caca”],目標=“aba”
- 輸出:6
這個問題是結合預處理和動態規劃來有效解決組合挑戰的一個很好的例子。
聯絡連結
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
- 領英
- GitHub
以上是給定字典形成目標字串的方法數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。
