标签:palindrome 回文 leetcode
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
For example, given s = "aab"
,
Return 1
since the palindrome partitioning ["aa","b"]
could
be produced using 1 cut.
将一个字符串分隔成子串,每个子串都是回文。
要求,返回最小的分隔数。
基本思路:
动态规划。
用一个数组,cut[i], 表示第i位以前的字符串,最小的分隔数。
设下标 i, j, i<j, 如果s[i,j]子串为一个回文,则 cut[j+1] = min(cut[j+1], cut[i]+1)。
采用中心扩张法,逐步扩大回文子串的范围。
即对每一个字符,以该字符为中心,如果两边字符相等,则为一个回文;由此往外逐步扩张,直到不等为止。
对每找到一个回文,应用cut[j+1] = min(cut[j+1], cut[i]+1) 更新cut数组。
注意中心扩张法,分成两种方式,一是奇扩张,即以该字符为中心。
二是偶扩张,以该字符和该字符前面的一个字符,整体作为中心,进行扩张。
在leetcode上实际执行时间为12ms。
class Solution { public: int minCut(string s) { vector<int> cut(s.size()+1, s.size()-1); cut[0] = -1; for (int i=0; i<s.size(); i++) { for (int j=0; i-j>=0 && i+j<s.size() && s[i-j] == s[i+j]; j++) { cut[i+j+1] = min(cut[i+j+1], cut[i-j]+1); } for (int j=0; i-j-1>=0 && i+j<s.size() && s[i-j-1] == s[i+j]; j++) { cut[i+j+1] = min(cut[i+j+1], cut[i-j-1]+1); } } return cut[s.size()]; } };
该算法思路来源:
https://leetcode.com/discuss/9476/solution-does-not-need-table-palindrome-right-uses-only-space在偶扩张时,与原代码略有不同。并在数组初始化略略作了改进。去掉了一个循环。
只用 cut[0] = -1。
Palindrome Partitioning II -- leetcode
标签:palindrome 回文 leetcode
原文地址:http://blog.csdn.net/elton_xiao/article/details/46047791