leetcode每日一题之10.分割回文串 II
分割回文串 II
解题思路
跟最长递增子序列思路一样,使用动态规划。
定义 dp[i]
为结尾为i的最小回文串次数.
-
当
[0,i]
为回文串时,则dp[i]
为0 -
当
[0,i]
不为回文串时,循环求最小的分割次数
如何循环
从0
开始一直到i-1
,作为j
。如果[j + 1, i]
为回文串,则取dp[j] + 1
.
代码
class Solution {
public $palindromeArray;
/**
* @param String $s
* @return Integer
*/
function minCut($s) {
$length = strlen($s);
if($length < 2) return 0;
// 动态规划求所有的子串是否为回文串
$this->setpalindromeArray($s, $length);
$dp = [];
for($i =0; $i < $length; ++ $i){
$dp[$i] = $i;
}
for($i = 1; $i < $length; ++$i){
if($this->palindromeArray[0][$i]){
$dp[$i] = 0;
} else {
for($j = 0; $j < $i; ++$j){
if($this->palindromeArray[$j + 1][$i]){
$dp[$i] = min($dp[$i], $dp[$j] + 1);
}
}
}
}
return $dp[$length - 1];
}
function setpalindromeArray($string, $length){
for($right = 0; $right < $length; ++$right){
for($left = $right; $left >=0; --$left){
if($string[$left] == $string[$right] && ($right - $left < 2 || $this->palindromeArray[$left + 1][$right - 1])){
$this->palindromeArray[$left][$right] = true;
} else {
$this->palindromeArray[$left][$right] = false;
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?