# 分割回文串 II

<p>给你一个字符串 <code>s</code>，请你将 <code>s</code> 分割成一些子串，使每个子串都是回文。</p>

<p>返回符合要求的 <strong>最少分割次数</strong> 。</p>

<div class="original__bRMd">
<div>
<p> </p>

<p><strong>示例 1：</strong></p>

<pre>
<strong>输入：</strong>s = "aab"
<strong>输出：</strong>1
<strong>解释：</strong>只需一次分割就可将 <em>s </em>分割成 ["aa","b"] 这样两个回文子串。
</pre>

<p><strong>示例 2：</strong></p>

<pre>
<strong>输入：</strong>s = "a"
<strong>输出：</strong>0
</pre>

<p><strong>示例 3：</strong></p>

<pre>
<strong>输入：</strong>s = "ab"
<strong>输出：</strong>1
</pre>

<p> </p>

<p><strong>提示：</strong></p>

<ul>
	<li><code>1 <= s.length <= 2000</code></li>
	<li><code>s</code> 仅由小写英文字母组成</li>
</ul>
</div>
</div>


## template

```cpp
#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int minCut(string s)
    {

        const int N = s.size();
        if (N <= 1)
            return 0;

        int i, j;

        bool isPalin[N][N];

        fill_n(&isPalin[0][0], N * N, false);

        int minCuts[N + 1];
        for (i = 0; i <= N; ++i)
            minCuts[i] = i - 1;

        for (j = 1; j < N; ++j)
        {
            for (i = j; i >= 0; --i)
            {

                if ((s[i] == s[j]) && ((j - i < 2) || isPalin[i + 1][j - 1]))
                {
                    isPalin[i][j] = true;
                    minCuts[j + 1] = min(minCuts[j + 1], 1 + minCuts[i]);
                }
            }
        }
        return minCuts[N];
    }
};

```

## 答案

```cpp

```

## 选项

### A

```cpp

```

### B

```cpp

```

### C

```cpp

```