zoukankan      html  css  js  c++  java
  • [Leetcode] Palindrome Partitioning II

    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.

    动态规划,dp[i]表示从s_0到s_i的最小cut,为了避免重复比较,定义标记矩阵flag[i][j],用来存储s_i到s_j是否为回文。

     1 class Solution {
     2 public:
     3     int minCut(string s) {
     4         vector<int> dp(s.length(), 0);
     5         vector<vector<bool> > flag(s.length(), vector<bool>(s.length(), false));
     6         flag[0][0] = true;
     7         for (int i = 1; i < s.length(); ++i) {
     8             flag[i][i] = true;
     9             dp[i] = dp[i-1] + 1;
    10             for (int len = 1; len < i + 1; ++len) {
    11                 if (s[i-len] == s[i] && (len < 2 || flag[i-len+1][i-1])) {
    12                     dp[i] = (i - len == 0) ? 0 : min(dp[i], dp[i-len-1] + 1);
    13                     flag[i-len][i] = true;
    14                 }
    15             }
    16         }
    17         return dp[s.length() - 1];
    18     }
    19 };

    换个字母代码更好理解一些。

     1 class Solution {
     2 public:
     3     int minCut(string s) {
     4         vector<int> dp(s.length(), 0);
     5         vector<vector<bool> > flag(s.length(), vector<bool>(s.length(), false));
     6         flag[0][0] = true;
     7         for (int j = 1; j < s.length(); ++j) {
     8             flag[j][j] = true;
     9             dp[j] = dp[j-1] + 1;
    10             for (int i = 0; i < j; ++i) {
    11                 if (s[i] == s[j] && (i == j - 1 || flag[i+1][j-1])) {
    12                     dp[j] = (i == 0) ? 0 : min(dp[j], dp[i-1] + 1);
    13                     flag[i][j] = true;
    14                 }
    15             }
    16         }
    17         return dp[s.length()-1];
    18     }
    19 };

    DFS版本超时了。

     1 class Solution {
     2 public:
     3     bool isPail(string &s) {
     4         int low = 0, high = s.length() - 1;
     5         while (low < high) {
     6             if (s[low] != s[high]) {
     7                 return false;
     8             }
     9             ++low;
    10             --high;
    11         }
    12         return true;
    13     }
    14     
    15     void findNext(vector<vector<string> > &res, string &s, vector<string> part, int idx) {
    16         if (idx == s.length()) {
    17             res.push_back(part);
    18             return;
    19         }
    20         string substr;
    21         for (int len = s.length() - idx; len > 0; --len) {
    22             substr = s.substr(idx, len);
    23             if (isPail(substr)) {
    24                 part.push_back(substr);
    25                 findNext(res, s, part, idx + len);
    26                 part.pop_back();
    27             }
    28         }
    29     }
    30     
    31     int minCut(string s) {
    32         vector<vector<string> > res;
    33         vector<string> part;
    34         findNext(res, s, part, 0);
    35         int min = INT_MAX;
    36         for (int i = 0; i < res.size(); ++i) {
    37             min = (min > res[i].size()) ? res[i].size() : min;
    38         }
    39         return min - 1;
    40     }
    41 };
  • 相关阅读:
    Robot Framework环境搭建
    参数化登录QQ空间实例
    unittest单元测试框架总结(转载)
    判断弹出框存在(alert_is_ present)
    判断文本(text_to_be_present_in_element)
    判断title(title_is)
    判断元素(expected_conditions)
    等待页面元素(webdriverwait)
    unittest之断言
    unittest之装饰器
  • 原文地址:https://www.cnblogs.com/easonliu/p/3657817.html
Copyright © 2011-2022 走看看