次のように内容は次のとおりです。
あなたは、文字列与えられ、
s
小文字と整数を含むをk
。必要がある :
- まず、いくつかの文字を変更する
s
他の小文字の英文字にします。- その後、分割
s
にk
各部分が回文であるような非空互いに素ストリング。あなたは、文字列を分割するように変更する必要がある文字の最小数を返します。
例1:
入力:S =「ABC」、K = 2 出力:1 説明:あなたはそれが回文にするために、「AB」の「AB」と「C」、および変更1文字に文字列を分割することができます。例2:
入力:S = "aabbc"、K = 3 出力:0 説明: "AA"、 "BB"と"C"に文字列を分割することができ、それらのすべてが回文です。例3:
入力:S = "leetcode"、K = 8 出力:0制約:
1 <= k <= s.length <= 100
。s
小文字のみ英語の文字が含まれています。
ソリューションの概要:呼ぶDP [I] [J] = vはS [0:j]を表すが、セグメントJに分割され、Vの文字は、各セグメントは、サブストリングがパリンドローム配列であることができること間隔ように変更する必要があります。それはキーがjとj-1の分割点を見つけることであり、[I] [j]の値をDPが必要です。明らかに存在DP [I] [J] =分(DP [M] [J-1] + S [M:J] 文字の数を変更する)、必要のみMに最小の分割ポイントを見つけます。
コードは以下の通りであります:
クラス溶液(オブジェクト): DEF palindromePartition(自己、S、K): "" " :タイプS:STR :タイプK:INT :RTYPE:INT """ DEF CALC(SUBSTR): カウント = 0 のための I における範囲( LEN(SUBSTR)/ 2 ): もし SUBSTR [I] = SUBSTR [LEN(SUBSTR)-i - 1]:!数+ = 1 戻り、カウント DP = [[フロート(' INF ')] * kのための _ での] DP [0] [0] = 0 以下のための私に:範囲(LEN(S)) のために、J における範囲(K): もし J == 0: DP [I] [J] = CALC(S [た:i + 1 ]) を続行 するために、M に範囲(J -1 、I): DP [I] [J] =分(DP [I]、[J]、DP [M] [J-1] +計算値(S [M + 1:I + 1 ])) #の印刷DPの 戻り DP [-1] [ - 1]