題目和上題一樣 leetcode Palindrome Partitioning ,這里需要求的是最小的分割數,也就是上一題的所有可能里面最少的一個分割。例如:
For example, given?
s
?=?
"aab"
,
Return?
1
?since the palindrome partitioning?
["aa","b"]
?could be produced using 1 cut.
很明顯,如果我們和上體一樣把所有的答案求出來,然后返回最少元素的長度-1就可以了,但是Memory Limited了。我以為是ans存不了那么多的分割可能,所有每次只判斷要存的是否比之前的短,短的才需要存。這時候變成Time Limited了,還是不行。
只能用DP了。先用DP求i到j是否可能為回文。判斷i到j是回文有兩種情況:
1.如果i到j的長度為1,也就是j-i=0那肯定就是回文了,如果長度為2并且s[i] == s[j]那也是回文。長度為其他的就用下一點判斷了
2.i到j是回文,那么i+1到j-1是回文,并且s[i] == s[j]。
所以可以用第1點初始化,然后利用第2點擴展所有。或者可以說為了能夠使用第2點dp求解,第1點是必須的。然后i從末尾開始,j從i開始,這樣每次需要第2點的時候第一點都已經做完了。所以初始化可以一起寫在for里面的。
class
Solution {
public
:
int
minCut(
string
s)
{
if
(s.size() ==
0
)
return
0
;
bool
mat[s.size()][s.size()];
memset(mat,
0
,
sizeof
(mat));
//
很久才發現沒有初始化是錯誤的
for
(
int
i = s.size()-
1
; i >=
0
; --
i)
for
(
int
j = i; j < s.size(); ++
j)
{
if
((s[i] == s[j] && j - i <
2
) || (s[i] == s[j] && mat[i+
1
][j-
1
]))
mat[i][j]
=
true
;
}
int
cnt[s.size()+
1
];
//
最后一個為0,用于j+1溢出的操作
memset(cnt,
0
,
sizeof
(cnt));
for
(
int
i = s.size() -
1
; i >=
0
; --
i)
{
cnt[i]
= s.size() -
i;
for
(
int
j = i; j < s.size(); ++j)
//
j一定是從i開始,因為可能存在i是一個孤立的加上i+1到之后的最小值
{
if
(mat[i][j])
cnt[i]
= min(cnt[i], cnt[j +
1
] +
1
);
}
}
return
cnt[
0
] -
1
;
}
};
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

