LeetCode第87題(擾亂字串)

2021-08-28 07:06:48 字數 1740 閱讀 4594

給定乙個字串 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

這道題確實是比較坑的,因為他打上了動態規劃的標籤,但是說實話 ,我連最優子結構 都找不到。。。所以只能另尋它路,同時你需要注意題中的一句話!!!「我們可以挑選任何乙個非葉節點,然後交換它的兩個子節點」也就是說 任何乙個大於等於2個size的串 都可以拆分成 2個部分!!!

比如 great 可以拆成 「g+reat」 「gr+eat」 「gre+at」 「 grea+t 」 再從s2中挑選出 相同 size的串 來比較是否是擾亂子串 即可

根據上面的提示 一般都可以很快的寫出答案來,但是!!!!!!!你會發現時間複雜度達不到!!!(這個時候 你需要有以下思考,

1.我是否做了很多無用功(讓計算機計算了根本就沒有必要的部分)

2.如果1中我沒有做無用功,那麼說明這個演算法本身就有問題,我需要想其他的方法)

經過仔細觀察,你會發現 如果 s1 被拆成 gr+eat s2 被拆成 eag +rt 的時候

其實根本就沒有必要 去比較 rt是否是 gr的擾亂字串了!!!!!!直接就return false

vectorstr_hash(string &s)

return m;

}bool bijiao(vector&a, vector&b)

return true;

} bool isscramble(string &s1, string &s2)

vectors1_hash = str_hash(s1);

vectors2_hash = str_hash(s2);

if (bijiao(s1_hash, s2_hash) == false) return false;

for (int size = 1; size <= s2.size() - 1; size++)

} return false;

}

leetcode87 擾亂字串

給定乙個字串 s1,我們可以把它遞迴地分割成兩個非空子字串,從而將其表示為二叉樹。下圖是字串 s1 great 的一種可能的表示形式。great gr eat g r e at a t 在擾亂這個字串的過程中,我們可以挑選任何乙個非葉節點,然後交換它的兩個子節點。例如,如果我們挑選非葉節點 gr 交...

leetcode 87 擾亂字串

給定乙個字串 s1,我們可以把它遞迴地分割成兩個非空子字串,從而將其表示為二叉樹。下圖是字串 s1 great 的一種可能的表示形式。great gr eat g r e at a t 在擾亂這個字串的過程中,我們可以挑選任何乙個非葉節點,然後交換它的兩個子節點。例如,如果我們挑選非葉節點 gr 交...

leetcode 87 擾亂字串

87.擾亂字串 沒有任何思路 直接google別人的題解,大致看懂了吧 簡單的說,就是s1和s2是scramble的話,那麼必然存在乙個在s1上的長度l1,將s1分成s11和s12兩段,同樣有s21和s22.那麼要麼s11和s21是scramble的並且s12和s22是scramble的 要麼s11...