給定乙個字串 s1,我們可以把它遞迴地分割成兩個非空子字串,從而將其表示為二叉樹。
下圖是字串 s1 = "great" 的一種可能的表示形式。
great
gr eat
g r e at
a t在擾亂這個字串的過程中,我們可以挑選任何乙個非葉節點,然後交換它的兩個子節點。
例如,如果我們挑選非葉節點 "gr" ,交換它的兩個子節點,將會產生擾亂字串 "rgeat" 。
rgeat
rg eat
r g e at
a t我們將 "rgeat」 稱作 "great" 的乙個擾亂字串。
同樣地,如果我們繼續交換節點 "eat" 和 "at" 的子節點,將會產生另乙個新的擾亂字串 "rgtae" 。
rgtae
rg tae
r g ta e
t a我們將 "rgtae」 稱作 "great" 的乙個擾亂字串。
給出兩個長度相等的字串 s1 和 s2,判斷 s2 是否是 s1 的擾亂字串。
示例 1:輸入: s1 = "great", s2 = "rgeat" 輸出: true
示例 2:輸入: s1 = "abcde", s2 = "caebd" 輸出: false
1、動態規劃;時間複雜度o(n^4),空間複雜度o(n^3)
func isscramble(s1 string, s2 string) bool // dp[i][j][l]:表示s1從i開始,s2從j開始長度為l的兩個子字串是擾亂dp := make(bool, n+1)for i := 0; i <= n; i++ }// 單個字元for i := 0; i < n; i++ }for k := 2; k <= n; k++ }}}}return dp[0][0][n]}
2、遞迴;時間複雜度o(5^n),空間複雜度o(n)
func isscramble(s1 string, s2 string) bool func dfs(arr1, arr2 byte) bool if len(arr1) <= 2 for i := 1; i < len(arr1); i++ }return false}func compare(arr1, arr2 byte) bool arra := make(byte, 26)arrb := make(byte, 26)for i := 0; i < len(arr1); i++ for i := 0; i < len(arra); i++ }return true}
hard題目,考察字串動態規劃解 交換兩個字串
交換兩個字串,原來的字串分別為 學生 和 好 字串輸出顯示為 學生好 交換後輸出顯示為 好學生 include using namespace std int main char c1 5 學生 char c2 3 好 char m,n,t m c1 n c2 cout 交換前 m n n t co...
字串hash 交換兩個字元
題意 給 k個字串,長度為n 是否存在乙個串 換兩個字元可以包含k個字串 正解是 n 2 k 這裡是字串hash n 2 klogk 超時,只是沒有好好做過字串hash,這裡記錄一下 include using namespace std typedef long long ll const int...
連線兩個字串
include include void main char lianjie char a 30 char b 30 原型 extern char strcat char dest,char src 用法 include 功能 把src所指字串新增到dest結尾處 覆蓋dest結尾處的 0 並新增 ...