[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)
時間復雜度:O(NM) 空間復雜度:O(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][动态规划]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hook的两个小插曲
- 下一篇: 理解Javascritp中的引用