次のように内容は次のとおりです。
可能な限り最大の戻り
k
が存在するようa_1, a_2, ..., a_k
なことを:
- それぞれの
a_i
非空の文字列です。- 彼らの連結は
a_1 + a_2 + ... + a_k
に等しいですtext
。- すべてのために
1 <= i <= k
、a_i = a_{k+1 - i}
。
例1:
入力:テキスト= "ghiabcdefhelloadamhelloabcdefghi" 出力:7 説明:私たちは、 "(GHI)(ABCDEF)(ハロー)(ADAM)(ハロー)(ABCDEF)(GHI)"で文字列を分割することができます。例2:
入力:テキスト=「商人」 出力:1つの 説明:私たちは、「(商人)」で文字列を分割することができます。例3:
入力:テキスト= "antaprezatepzapreanta" 出力:11 説明:私たちは、(a)は」上の文字列を分割することができます(NT)(a)の(前)(ZA)(TPE)(ZA)(前)(a)の(NT)( A)」。例4:
入力:テキスト= "AAA" 出力:3 説明:私たちは、上の文字列を分割することができます"(A)(A)(A)"。
制約:
text
小文字のみ、英語の文字で構成されます。1 <= text.length <= 1000
問題解決のアイデア:このタイトルは私のアプローチは、貪欲アルゴリズム+デュアルポインタである、あまりにも難しいことではありません。最初の[-1] [0]、テキストをテキストに等しいそれぞれ二つの変数の頭と尾を、導入します。ヘッドは、両方の部分は、2つのパリンドロームセグメントから構成されてもよい表す尾に等しい場合には、ヘッド等しいテキスト[1]、尾等しいテキストを[-2]行い、両者が等しくない場合、その結果、ヘッド=ヘッド+テキスト[0] 、尾=テキスト[-2] +尾部、 頭部は尾部に等しくなるまで。尾のヘッドは、2つのパリンドロームセグメント、ヘッドとリセット値の尾部の一部を表し、それぞれの場合に、遭遇する原理は同じです。
コードは以下の通りであります:
クラスのソリューション(オブジェクト): デフlongestDecomposition(自己、テキスト): "" " :text型:STR :RTYPE:int型 """ RES = 0 head_inx = 0 tail_inx = LEN(テキスト) - 1 頭 = '' 尾 = " 「 しばらく head_inx <= tail_inx と head_inx <LEN(テキスト)と tail_inx> = 0: もし頭== '' とテール== '' : ヘッド =テキスト[head_inx] テール = テキスト[tail_inx] head_inx + = 1 tail_inx - = 1つの ELIFのヘッド== 尾: RES + = 2 頭 = テキスト[head_inx] テール = テキスト[tail_inx] head_inx + = 1 tail_inx - = 1 他: #1 head_inx + = 1 #tail_inx - = 1つの ヘッド=ヘッド+ テキスト[head_inx] 尾=テキスト[tail_inx] + テール head_inx + = 1 tail_inx - = 1つの RES + = 2 であれば ヘッド==尾と head_inx - LEN(ヘッド)= tail_inx + LEN(尾)!他に 1つの リターン解像度の場合 RES = 0!他に 1