日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leetcode][第97题][JAVA][交错字符串][BFS][动态规划]

發布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第97题][JAVA][交错字符串][BFS][动态规划] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[中等]

【解答思路】

1. 動態規劃

第 1 步:設計狀態
f(i,j) 表示 s 1的前 i個元素和 s2 的前 j個元素是否能交錯組成 s3的前 i + j 個元素

第 2 步:狀態轉移方程

p = i + j - 1 p為s3的長度

第 3 步:考慮初始化
boolean[][] f = new boolean[n + 1][m + 1];
f(0,0)=True
第 4 步:考慮輸出
f[n][m];

第 5 步:考慮是否可以狀態壓縮

時間復雜度:O(NM) 空間復雜度:O(NM)

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n = s1.length(), m = s2.length(), t = s3.length(); //長度之和都不等,肯定無法由s1和s2交替組成s3if (n + m != t) {return false;}boolean[][] f = new boolean[n + 1][m + 1]; //邊界條件:認為s1的前0個字符和s2的前0個字符,可以交替組成s3的前0個字符f[0][0] = true;for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {int p = i + j - 1;if (i > 0) {//官方代碼前面這個'f[i][j] ||'是沒必要的f[i][j] = f[i][j] || (f[i - 1][j] && s1.charAt(i - 1) == s3.charAt(p));}if (j > 0) {//如果前一步i>0時已算出f[i][j]為true,則下面的||會短路,f[i][j]直接就是true了f[i][j] = f[i][j] || (f[i][j - 1] && s2.charAt(j - 1) == s3.charAt(p));}}} //返回結果:s1的前n個字符和s2的前m個字符,可否交替組成s3的前n+m個字符return f[n][m];} }

時間復雜度:O(NM) 空間復雜度:O(M)

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n = s1.length(), m = s2.length(), t = s3.length();if (n + m != t) {return false;}boolean[] f = new boolean[m + 1];f[0] = true;for (int i = 0; i <= n; ++i) {for (int j = 0; j <= m; ++j) {int p = i + j - 1;if (i > 0) {f[j] = f[j] && s1.charAt(i - 1) == s3.charAt(p);}if (j > 0) {f[j] = f[j] || (f[j - 1] && s2.charAt(j - 1) == s3.charAt(p));}}}return f[m];} }
2. BFS

時間復雜度:O(NM) 空間復雜度:O(NM)

class Solution {public boolean isInterleave(String s1, String s2, String s3) {int n1 = s1.length();int n2 = s2.length();int n3 = s3.length();if (n1 + n2 != n3) return false;//判斷是否已經遍歷過boolean[][] visited = new boolean[n1 + 1][n2 + 1];Queue<int[]> queue = new LinkedList<>();queue.offer(new int[]{0, 0});while (!queue.isEmpty()) {int[] tmp = queue.poll();/到達右下角就返回 trueif (tmp[0] == n1 && tmp[1] == n2) return true;/ 嘗試是否能向右走if (tmp[0] < n1 && s1.charAt(tmp[0]) == s3.charAt(tmp[0] + tmp[1]) && !visited[tmp[0] + 1][tmp[1]]) {visited[tmp[0] + 1][tmp[1]] = true;queue.offer(new int[]{tmp[0] + 1, tmp[1]});}/ 嘗試是否能向下走if (tmp[1] < n2 && s2.charAt(tmp[1]) == s3.charAt(tmp[0] + tmp[1]) && !visited[tmp[0]][tmp[1] + 1]) {visited[tmp[0]][tmp[1] + 1] = true;queue.offer(new int[]{tmp[0], tmp[1] + 1});}}return false;} }

【總結】

1. 動態規劃流程

第 1 步:設計狀態
第 2 步:狀態轉移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態壓縮

2. BFS DFS 遍歷好助手

轉載鏈接:https://leetcode-cn.com/problems/interleaving-string/solution/jiao-cuo-zi-fu-chuan-by-leetcode-solution/
參考鏈接:https://leetcode-cn.com/problems/interleaving-string/solution/dong-tai-gui-hua-he-bfs-by-powcai/

參考鏈接:https://leetcode-cn.com/problems/interleaving-string/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-2-9/

總結

以上是生活随笔為你收集整理的[Leetcode][第97题][JAVA][交错字符串][BFS][动态规划]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。