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