今日の出会いの問題は、私は私の分析と問題解決の考え方と兄の問題解決方法の感情を共有するために、アイデアがすべてです、と言っています。
820単語圧縮コーディング
トピック出典:https://leetcode-cn.com/problems/short-encoding-of-words/
単語のリストを考えると、このリストには、文字列SインデックスとインデックスリストAとしてエンコードされます
例えば、リストが[ "時間"、 "私"、 "ベル"]、我々は、S = "タイム#ベル#" とインデックス= [0、2、5]のように表すことができます。
各インデックスのために、私たちは言葉の私達の前のリストを復元するには、「#」終了までの位置にある文字列Sから文字列のインデックスを読むことによって開始することができます。
そして、エンコーディングのための与えられた単語リストを成功させるために、文字列の最小の長さはどのくらいですか?
例:
入力:言葉= [ "時間"、 "私"、 "ベル"]
出力:10
説明:S = "時間#ベル# "、インデックス= [0、2、5]。
ヒント:
1 <= words.length <= 2000
。1 <=ワード[I] .LENGTH <= 7
各ワード小文字。
対象要件について簡潔な説明:例えば、時間と私、あなたが再び私の時間#から#、確立する必要がない時間#の私の#を見つけることができますので、私のこのように最短の文字を形成し、サフィックスを除去するための時間があるので、文字列の長さ。
私の考え:それから、コレクションの構築を開始(デエンファシスの目的)、セットに単語の文字列、コレクションへのアクセスは、接尾辞の現在の文字列を削除します。最後に、コレクション(すべての文字列1の長さ)を追加し、それが最短の最終長さです。書き込み操作の後、過去だったが、(実際には接尾辞を削除するために使用することができSUBSTR、または未熟練ああ)を以下のようにもっとゆっくり、公式の解析コードの最適化の後に見えました。
もちろん、(実際には、簡潔なコードのように)この問題は、辞書ツリーで解決することができますが、スペースの複雑さが相対的に大きくなります。
クラス解決{ パブリック: INT minimumLengthEncoding(ベクトル< ストリング >・ワード){ int型 LEN = 0 。 unordered_set < ストリング > S(words.begin()、words.end())。 以下のため(のconst 文字列&単語:ワード) のための(int型私は= 1 ; I <word.size(); I ++ ) S.erase(word.substr(I)); のため(オートワード:S) でlen + =単語。サイズ()+ 1 。 リターンのみ; } }。
高い複雑さは、指数関数的です。
共有のアイデアに以下のギャングスター(に素晴らしいです)。
まず、文字列が辞書に順序に従って、常にコンテナをソートどの言語に関係なく、我々はルールを見つけることができ、逆の順序ですべての文字列、など:時間 - > EMIT ME-> EM dell-> lled、我々並べ替え、EMIT、我々は簡単にEMを見つけ、削除することができないのemの前に、必ずしもではありません。任意の文字列かどうか、あなたは辞書順に従って一つずつを除外することができ、最後に残った文字列のサフィックスは存在しません。
ギャングコード:
クラス解決{ パブリック: INT minimumLengthEncoding(ベクトル< ストリング >&{語) のための(自動&(S)ワード){ 逆(s.begin()、s.end())。 } ソート(words.begin()、words.end())。 int型のres = 0 ; 以下のために(INT iが= 0 ; I <words.size() - 1 ; I ++ ){ int型のサイズ= ワード[I] .size()。 もし(単語[I] ==ワード[I + 1 ] .SUBSTR(0、サイズ))続けます。 RES + =サイズ+ 1 。 } 戻り RES + words.back()サイズ()+。1 。 } }。
私はアイデアが強すぎると言うことができます。
パンチ:その後、接尾辞、思考、辞書ツリーの最初のセットを行く辞書式順序を逆に重い文字列に遭遇しました。