このタイトルは翻訳されません。。しかし、質問の意味は、この文字列は、バイナリツリーとして表現され、文字列S1を与えることです。ツリーのリーフノードは、各文字は、バイナリツリーの枝それぞれ最小でサポート自己に割り当てられています。
以下はの一つの可能な表現であり 、S1 =は
"great"
:素晴らしい / \ グラム食べる / \ / \ でGRE \ / 時
文字列をスクランブルするために、我々はすべての非リーフノードを選択し、その2人の子供を交換します。
我々はノードを選択した場合たとえば、
"gr"
とその2人の子供を交換、それがスクランブル文字列を生成します"rgeat"
。rgeat / \ RG食べ \ / \ / でRGE \ / 時私たちは、それが言う
"rgeat"
のスクランブル文字列です"great"
。
例として、素晴らしいとスクランブル文字列相互rgeatです。このタイトルタグは、DPを与えているが、実現DPはインタビュープロセスに完璧を達成することはほぼ不可能、3次元です。ここで私は、より直感的な再帰的な解決策を与えます。
時間はO(N!) - 私は本当にわからないんだけど
スペースO(N) - 再帰スタック領域で使用されます
1 / * * 2 * @param {文字列} S1 3 * @param {文字列} S2 4 * @return {ブール} 5 * / 6 のvar isScramble = 関数(S1、S2){ 7 であれば(S1 === S2)返す 真; 8つの CONSTの文字= 新しいアレイ(128).fill(0 )。 9 のconst A =「a'.charCodeAt(0 )。 10 のために(LET I = 0; I <s1.length; iは++ ){ 11の 文字[s1.charCodeAt(I) - A] ++ ; 12 文字[s2.charCodeAt(I) - A] - 。 13 } 14 のための(I = 0を聞かせて、私は128 <; Iは++ ){ 15 場合(文字は[I] == 0!)を返す 偽。 16 } 17 のために(iは++; iは<s1.length 1 =私に聞かせて、{) 18を 場合(isScrambleは((0 s2.substring、(0、I)s1.substring i)は、)&& (I isScramble(s1.substring )、(I)))s2.substring 19 リターンを 真。 20 であれば( 21 isScramble(s1.substring(0、I)、s2.substring(s2.length - I))&& 22 isScramble(s1.substring(I)、s2.substring(0、s2.length - I)) 23 ) 24 リターン 真。 25 } 26 リターン 偽。 27 }。