题目描述:
经典必刷编程题库——分割回文串II
给出一个字符串s,分割s使得分割出的每一个子串都是回文串 计算将字符串s分割成回文分割结果的最小切割数
例如:给定字符串s=“aab”,返回1,因为回文分割结果[“aa”,“b”]是切割一次生成的。
class Solution
{
public:
bool isPal(string& s, int start, int end)
{
while(start < end)
{
if(s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
int minCut(string s)
{
vector<int> ans(s.size() + 1);
for(int i = 0; i <= s.size(); i++)
ans[i] = i - 1;
for(int i = 2; i <= s.size(); i++)
{
for(int j = 0; j < i; j++)
{
if(isPal(s, j, i - 1))
{
ans[i] = min(ans[i], ans[j] + 1);
}
}
}
return ans[s.size()];
}
};
class Solution
{
public:
bool isPal(string& s, int start, int end)
{
while(start < end)
{
if(s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
int minCut(string s)
{
vector<int> ans(s.size() + 1);
for(int i = 1; i <= s.size(); i++)
ans[i] = i - 1;
for(int i = 2; i <= s.size(); i++)
{
// 判断整体
if(isPal(s, 0, i - 1))
{
ans[i] = 0;
continue;
}
for(int j = 1; j < i; j++)
{
if(isPal(s, j, i - 1))
{
ans[i] = min(ans[i], ans[j] + 1);
}
}
}
return ans[s.size()];
}
};
算法改进:空间换时间的思想
动态规划的思想判断回文串,并用一个二维数组将结果保存起来
将时间复杂度O(n^3)降为O(n ^2)
class Solution
{
public:
vector<vector<bool>> isPal(string s)
{
int len = s.size();
vector<vector<bool>> pMat(len, vector<bool>(len, false));
for (int i = len - 1; i >= 0; i--)
{
for (int j = i; j < len; j++)
{
if (i == j)
pMat[i][j] = true;
else if (i + 1 == j)
pMat[i][j] = s[i] == s[j];
else
pMat[i][j] = pMat[i + 1][j - 1] && (s[i] == s[j]);
}
}
return pMat;
}
int minCut(string s)
{
vector<int> ans(s.size() + 1);
vector<vector<bool>> pMat = isPal(s);
for(int i = 0; i <= s.size(); i++)
ans[i] = i - 1;
for(int i = 2; i <= s.size(); i++)
{
for(int j = 0; j < i; j++)
{
if(pMat[j][i - 1])
{
ans[i] = min(ans[i], ans[j] + 1);
}
}
}
return ans[s.size()];
}
};