java數據結構與算法刷題-----LeetCode572. 另一棵樹的子樹(經典題,樹字符串化KMP)

java數據結構與算法刷題目錄(劍指Offer、LeetCode、ACM)-----主目錄-----持續更新(進不去說明我沒寫完):https://blog.csdn.net/grd_java/article/details/123063846

文章目錄

    • 1. 暴力求解,深度優先
    • 2. KMP算法進行串匹配

在這里插入圖片描述

1. 暴力求解,深度優先

解題思路:時間復雜度O(s*t)其中s是樹的結點個數,t是子樹的結點個數。空間復雜度O(max(ds,dt))其中ds是樹的深度,dt是子樹的深度
  1. 我們先對整個樹深度優先遍歷
  2. 每個結點都與子樹的根節點進行比對
  3. 如果對上了,就以當前結點為根節點,進行和子樹的深度優先遍歷,看看是否一一對應
  4. 對應上就返回true,沒對應上就繼續深度優先遍歷。直到整個樹遍歷完成
代碼

在這里插入圖片描述

class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root == null && subRoot == null) return true;//如果都為null,就無需找子樹了else if(root == null || subRoot == null) return false;//如果有一個為null,另一個不是null,肯定不是子樹//先進行深度優先遍歷,直接比對當前結點,如果能對上就可以省下很多時間//遍歷到底時,再去isSameTree方法中,判斷以當前root為根的子樹,是否和subRoot是一樣的else return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot)||isSameTree(root,subRoot);}//深度優先判斷是否是相同的樹public boolean isSameTree(TreeNode root,TreeNode subRoot){if(root == null && subRoot == null) return true;if(root == null || subRoot == null) return false;if(root.val == subRoot.val){return isSameTree(root.left,subRoot.left) && isSameTree(root.right,subRoot.right);}return false;}
}

2. KMP算法進行串匹配

KMP算法https://blog.csdn.net/grd_java/article/details/136107363
解題思路:時間復雜度O(s+t),空間復雜度O(s+t)
  1. 生成兩顆樹的遍歷序列,以類似如下的形式:(下面形式是廣度(層序)遍歷序列,需要額外空間輔助,所以我們放棄)
    在這里插入圖片描述
  2. 為了效率和更少的空間,我們使用廣度優先遍歷。那么就需要兩個不同的值,來表示某結點左子樹為空,和右子樹為空的情況。
  3. 同樣為了效率,我們不使用字符串比較,選用int型容器,比如int型的鏈表來生成匹配串
  4. 那么null如何來表示呢?
  1. 我們可以規定兩個值,來分別表示左子樹為null和右子樹為null的情況
  2. 這里我選擇先找到樹中最大值max,然后令max+1表示左子樹為空情況,max+2表示右子樹為空情況
  1. 生成兩顆樹的匹配串后,讓大樹作為主字符串,要匹配的子樹作為要匹配的子串,改編KMP算法,如果匹配成功,說明樹中可以匹配到子樹
代碼:leetcode的特色之一就是,更優的算法,有時因為使用程序自帶的特殊容器(比如Java中的List),因為這些容器初始化比較耗時間,反而耗時更高。但是實際工作場景,一旦數據量起來,肯定是這個算法優于上面的暴力解法的。

在這里插入圖片描述

class Solution {List<Integer> sOrder = new ArrayList<Integer>();//用來保存s樹的遍歷結果,主串List<Integer> tOrder = new ArrayList<Integer>();//保存t樹,匹配串int maxElement, lNull, rNull;//maxElement保存兩顆樹中最大值,lNull為左子樹為空的標記,rNull為右子樹為空//此方法獲取樹中最大值,深度優先public void getMaxElement(TreeNode t) {if (t == null) return;maxElement = Math.max(maxElement, t.val);getMaxElement(t.left);getMaxElement(t.right);}//此方法生成樹的遍歷字符串,其中,左右子樹為null的,使用lNull和rNull填充public void getDfsOrder(TreeNode t, List<Integer> tar) {if (t == null) return;tar.add(t.val);//填充當前值//如果左子樹為null填充lNull,否則繼續遍歷左子樹if (t.left != null) getDfsOrder(t.left, tar);else tar.add(lNull);//右子樹不為null繼續遍歷右子樹,否則填充rNullif (t.right != null) getDfsOrder(t.right, tar);else tar.add(rNull);}//入口方法,1.獲取樹最大值max,并令max+1作為lNull,max+2作為rNull//2. 獲取兩顆樹的遍歷串。 3. kmp算法進行匹配public boolean isSubtree(TreeNode s, TreeNode t) {maxElement = Integer.MIN_VALUE;//獲取兩顆樹中的最大值getMaxElement(s);getMaxElement(t);//則最大值+1和+2是樹中絕對不存在的兩個值lNull = maxElement + 1;//最大值+1作為左子樹為空的填充串rNull = maxElement + 2;//最大值+2為右子樹為空//獲取兩顆樹的遍歷串getDfsOrder(s, sOrder);getDfsOrder(t, tOrder);//通過kmp算法return kmp();}//kmp算法,如果匹配到子串,說明樹中可以匹配到t這顆子樹public boolean kmp() {int sLen = sOrder.size(), tLen = tOrder.size();int[] fail = new int[tOrder.size()];fail[0] = 0;for (int i = 1, j = 0; i < tLen; ++i) {while (j > 0 && !(tOrder.get(i).equals(tOrder.get(j)))) j = fail[j-1];if (tOrder.get(i).equals(tOrder.get(j))) ++j;fail[i] = j;}for (int i = 0, j = 0; i < sLen; ++i) {while (j > 0 && !(sOrder.get(i).equals(tOrder.get(j)))) j = fail[j-1];if (sOrder.get(i).equals(tOrder.get(j))) ++j;if (j == tLen) return true;}return false;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713764.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WinForm、Wpf自動升級 AutoUpdater.NET

Github AutoUpdater.NET 目錄 一、IIS部署 更新站點 二、創建Winform 一、IIS部署 更新站點 IIS默認站點目錄下創建 目錄 Downloads、Updates Updates目錄創建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…

從零開始手寫RPC框架(2)——Netty入門

學習前需要掌握基本的java網絡編程&#xff0c;可參考這篇博客 目錄 Netty 簡介Netty 使用 kryo 序列化傳輸對象案例客戶端代碼服務端代碼編碼器 Netty 簡介 是什么&#xff1f; Netty 是一個基于 NIO (Non-blocking I/O&#xff0c;非阻塞I/O)的 client-server(客戶端服務器…

mysql學習--binlog與gtid主從同步

基礎環境 基于centOS7-MySQL8.0.35版本 我們先準備一臺主服務器兩臺從服務器來實現我們主從同步的訴求 Master&#xff1a;192.168.75.142 slave1:192.168.75.143 slave&#xff1a;192.168.75.145 binlog主從同步 主庫配置 #我們需要在主從庫中都需要添加server_id&am…

大龍談智能內容開通視頻號啦

大家好&#xff0c;大龍談只能內容開通視頻號了&#xff0c;歡迎大家掃碼關注&#xff1a;

RISC-V特權架構 - 中斷與異常概述

RISC-V特權架構 - 中斷與異常概述 1 中斷概述2 異常概述3 廣義上的異常3.1 同步異常3.2 異步異常3.3 常見同步異常和異步異常 本文屬于《 RISC-V指令集基礎系列教程》之一&#xff0c;歡迎查看其它文章。 1 中斷概述 中斷&#xff08;Interrupt&#xff09;機制&#xff0c;即…

RocketMQ安裝

mq服務端安裝配置啟動把windows做成服務 mq管理界面安裝配置啟動 mq服務端 安裝 RocketMQ下載地址 配置 ROCKETMQ_HOME D:\google-d\rocketmq-all-5.2.0-bin-release啟動 # bin目錄cmd輸入 start mqnamesrv.cmd把windows做成服務 http://t.csdnimg.cn/qd2RD mq管理界面 …

ubuntu22.04安裝mysql8.0

官網下載mysql&#xff1a;MySQL :: Download MySQL Community Server 將mysql-server_8.0.20-2ubuntu20.04_amd64.deb-bundle.tar上傳到/usr/local/src #解壓壓縮文件 tar -xvf mysql-server_8.0.20-2ubuntu20.04_amd64.deb-bundle.tar解壓依賴包依次輸入命令 sudo dpkg -i m…

編程筆記 Golang基礎 045 math包

編程筆記 Golang基礎 045 math包 一、math包主要功能常量&#xff1a;函數&#xff1a;數值運算&#xff1a;三角函數&#xff1a;對數函數&#xff1a;隨機數相關&#xff1a; 二、示例代碼一三、示例代碼二小結 Go 語言的標準庫 math 提供了一系列基礎數學函數和常量&#xf…

EasyRecovery數據恢復軟件2024最新版包括Windows和Mac

EasyRecovery數據恢復軟件適用于多種環境和使用場景。首先&#xff0c;它適用于各種操作系統&#xff0c;包括Windows和Mac。無論用戶使用的是哪種操作系統&#xff0c;都可以使用該軟件進行數據恢復。 其次&#xff0c;EasyRecovery支持從各種存儲設備和媒介中恢復數據&#…

自定義BeanNameGenerator生成規則

通過點進ComponentScan注解進入源碼可以看到 追隨BeanNameGenerator進入源碼可以看到該類是個借口且只有一個方法 點擊上面黑色箭頭出現兩個實現方法 點擊第一個方法 進入determineBeanNameFromAnnotation方法中 通過上訴自定義一個生成beanName方法 先創建一個CustomeBeanN…

使用結構體和類在Unity中管理IMU數據

使用結構體和類在Unity中管理IMU數據 IMU數據簡介使用結構體管理IMU數據結構體的優點結構體的使用場景 使用類管理IMU數據類的優點類的使用場景 結構體(struct) vs 類(class)為什么考慮使用結構體 結論 在Unity開發中&#xff0c;合理地選擇數據結構對于確保游戲和應用的性能和…

60 個 CSS 選擇器,一網打盡!

CSS 選擇器用于選擇 HTML 元素并將樣式應用于它們。使用這些選擇器&#xff0c;可以定義特定條件下應用哪些樣式。除了普通的選擇器外&#xff0c;還有偽類和偽元素&#xff0c;用于選擇具有特定狀態或特定部分的元素&#xff0c;并將樣式應用于它們。本文將通過圖文并茂的方式…

Windows11家庭版安裝Docker

文章目錄 安裝Docker安裝hyper-v繼續解決報錯完成效果圖進一步測試是否完成安裝 安裝Docker windows如何安裝docker 裝好之后&#xff0c;我打開報錯。 安裝hyper-v 按這個視頻操作&#xff1a;Windows 11 家庭版安裝 Hyper-V bat文件里的代碼是&#xff1a; pushd "…

【Educoder數據挖掘實訓】異常值檢測-3σ法

【Educoder數據挖掘實訓】異常值檢測-3σ法 開挖&#xff01; 這個異常值檢測基于的是兩點&#xff1a; 數據往往遵循正態分布在正態分布中&#xff0c; [ μ ? 3 σ , μ 3 σ ] [\mu - 3\sigma, \mu 3\sigma] [μ?3σ,μ3σ]包含了正態分布中 99.74 % 99.74\% 99.74%的數…

【投稿優惠|快速見刊】2024年圖像,機器學習和人工智能國際會議(ICIMLAI 2024)

【投稿優惠|快速見刊】2024年圖像&#xff0c;機器學習和人工智能國際會議&#xff08;ICIMLAI 2024&#xff09; 重要信息 會議官網&#xff1a;http://www.icimlai.com會議地址&#xff1a;深圳召開日期&#xff1a;2024.03.30截稿日期&#xff1a;2024.03.20 &#xff08;先…

2024全國水科技大會暨高氨氮廢水厭氧氨氧化處理技術論壇(四)

一、會議背景 為積極應對“十四五”期間我國生態環境治理面臨的挑戰&#xff0c;加快生態環境科技創新&#xff0c;構建綠色技術創新體系&#xff0c;全面落實科學技術部、生態環境部等部委編制的《“十四五”生態環境領域科技創新專項規劃》&#xff0c;積極落實省校合作&…

pip下載paddle、sklearn、cv2問題

ModuleNotFoundError: No module named ‘paddle‘ ModuleNotFoundError: No module named sklearn No matching distribution found for cv2 Could not build wheels for opencv-python, which is required to install pyproj

什么是BGP網絡 (邊界網關協議)

BGP&#xff08;邊界網關協議&#xff09;是一種用于在互聯網中交換路由信息的協議。作為網關或路由器之間的協議&#xff0c;BGP主要用于幫助確定數據包在網絡中的路徑。它通過在不同自治系統&#xff08;AS&#xff09;之間交換路徑信息&#xff0c;實現了全球互聯網網絡的連…

MySQL進階之(三)InnoDB數據存儲結構之數據頁結構

三、InnoDB數據存儲結構之數據頁結構 3.1 數據庫的存儲結構3.1.1 MySQL 數據存儲目錄3.1.2 頁的引入3.1.3 頁的概述3.1.4 頁的上層結構 3.2 數據頁結構3.2.1 文件頭和文件尾01、File Header&#xff08;文件頭部&#xff09;02、File Trailer&#xff08;文件尾部&#xff09; …

【JavaEE】_Spring Web MVC簡介

目錄 1. Spring Web MVC簡介 2. MVC簡介 3. Spring MVC 1. Spring Web MVC簡介 官網對于Spring Web MVC的介紹如下&#xff1a; 鏈接如下&#xff1a; https://docs.spring.io/spring-framework/reference/web/webmvc.html#https://docs.spring.io/spring-framework/refer…