leetcode Palindrome Partitioning II

来源:互联网 发布:品质淘生活 淘宝达人 编辑:程序博客网 时间:2024/06/05 04:04

起初分析题目 | 与 ||, 发现 || 可以在 | 的基础上稍作改变即可,提交如下代码后发现对于数据量比较大的测试用例出现超时问题。

超时的代码:

class Solution{public:int minCut(string s){   int size = s.length(); min = size+1;vector<bool> flag(size, false);bool **partitionLoc = new bool *[size];for(int i = 0; i < size; ++i){partitionLoc[i] = new bool[size];for(int j = 0; j < size; ++j)partitionLoc[i][j] = false;}for(int i = 1; i <= size; ++i){string substr = s.substr(0,i);if(judgePalindrome(substr)){flag[i-1] = true;partitionLoc[i-1][0] = true;}if(flag[i-1]){for(int j = 1; j <= size - i; ++j){if(judgePalindrome(s.substr(i,j))){flag[i+j-1] = true;partitionLoc[i+j-1][i] = true;}}}}vector<int> insertBlankLoc;vector<vector<string>> result;partitionHelper(s, size, size-1, flag, partitionLoc, insertBlankLoc, result);return min;}void partitionHelper(string s, int size, int currentPos, vector<bool> flag, bool **partitionLoc, vector<int> insertBlankLoc, vector<vector<string> > &result){if(currentPos==-1){if(min>insertBlankLoc.size())    min = insertBlankLoc.size();return ;}for(int i = 0; i < size; ++i){if(partitionLoc[currentPos][i]){insertBlankLoc.push_back(i);partitionHelper(s, size, i-1, flag, partitionLoc, insertBlankLoc, result);insertBlankLoc.pop_back();}}}bool judgePalindrome(string s){for(int i = 0 ;i < s.length()/2; ++i){if(s[i]!=s[s.length()-i-1])return false;}return true;}private:   int min;};



后参考博客http://blog.csdn.net/yutianzuijin/article/details/16850031

其将该问题解释的非常清晰易懂

最后代码为

class Solution{public:        int minCut(string s) {          // IMPORTANT: Please reset any member data you declared, as          // the same Solution instance will be reused for each test case.          int len = s.size();          int* dp = new int[len+1];          for(int i=len; i>=0; i--)              dp[i] = len-i;          bool** matrix = new bool*[len];          for(int i=0; i<len; i++)          {              matrix[i] = new bool[len];              memset(matrix[i], false, sizeof(bool)*len);          }          for(int i=len-1; i>=0; i--)              for(int j=i; j<len; j++)              {                  if(s[i] == s[j] && (j-i<2 || matrix[i+1][j-1]))                  {                      matrix[i][j] = true;                     dp[i] = min(dp[i], dp[j+1]+1);                  }              }          return dp[0]-1;      }      };




0 0