【LeetCode] 87.スクランブル文字列

このタイトルは翻訳されません。しかし、質問の意味は、この文字列は、バイナリツリーとして表現され、文字列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 }。

 

おすすめ

転載: www.cnblogs.com/aaronliu1991/p/11762580.html