108-分割回文串 II

给定一个字符串s,将s分割成一些子串,使每个子串都是回文。

返回s符合要求的的最少分割次数。

样例

比如,给出字符串s = "aab",

返回 1, 因为进行一次分割可以将字符串s分割成["aa","b"]这样两个回文子串

标签

动态规划

方法一(大体上没问题,但会在样例aaa....aaa上超时)

使用一维数组 dp[i] 记录s[i]...s[n-1]的最小切割数,状态转移方程为:dp[i] = min{dp[j]+1, dp[i]} (j=i+1...n-1)

code

class Solution {
public:
/**
* http://www.lintcode.com/zh-cn/problem/palindrome-partitioning-ii/-108-分割回文串 II
* @param s a string
* @return an integer
*/
int minCut(string s) {
// write your code here
int size = s.size(), i = 0, j = 0;
if(size <= 0) {
return 0;
} vector<int> dp(size+1, 0x7FFFFFFF);
for(i=size-1; i>=0; i--) {
if(isPalindromeFun(s, i, size-1)) {
dp[i] = 0;
continue;
}
for(j=i+1; j<size; j++) {
if(isPalindromeFun(s, i, j-1)) {
dp[i] = (dp[i] < dp[j]+1) ? dp[i] : dp[j]+1;
}
}
} return dp[0];
} bool isPalindromeFun(string s, int begin, int end) {
for(int i=begin, j=end; i<j; i++, j--) {
if(s[i] != s[j]) {
return false;
}
}
return true;
}
};

方法二(改进了回文字符串的判断方式,Accept)

参考博客:http://www.tuicool.com/articles/Jbeuea

动态规划部分与方法一相同,只是改进了回文字符串的判断方式,不再是实时判断回文,而是将回文结果保存至二维数组 isPalindrome[i][j] 中,若 isPalindrome[i][j] = true,则 s[i]...s[j] 是回文串

code

class Solution {
public:
/**
* @param s a string
* @return an integer
*/
int minCut(string s) {
// write your code here
int size = s.size(), i = 0, j = 0;
if(size <= 0) {
return 0;
} bool **isPalindrome = new bool*[size];
for (i=0; i<size; i++) {
isPalindrome[i] = new bool[size];
}
initIsPalindrome(isPalindrome, s); vector<int> dp(size+1, 0x7FFFFFFF);
for(i=size-1; i>=0; i--) {
if(isPalindrome[i][size-1]) {
dp[i] = 0;
continue;
}
for(j=i+1; j<size; j++) {
if(isPalindrome[i][j-1]) {
dp[i] = (dp[i] < dp[j]+1) ? dp[i] : dp[j]+1;
}
}
} return dp[0];
} void initIsPalindrome(bool ** isPalindrome, const string& s) {
int len = s.length();
for (int L = 1; L <= len; ++L) {
for (int i = 0; i < len - L + 1; ++i) {
int j = i + L - 1;
if (L == 1) {
isPalindrome[i][j] = true;
} else if (L == 2) {
isPalindrome[i][j] = s[i] == s[j];
} else {
isPalindrome[i][j] = (s[i] == s[j]) && isPalindrome[i + 1][j - 1];
}
}
}
}
};

lintcode-108-分割回文串 II的更多相关文章

  1. Java实现 LeetCode 132 分割回文串 II(二)

    132. 分割回文串 II 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一 ...

  2. Leetcode 132.分割回文串II

    分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ...

  3. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  4. 分割回文串 II · Palindrome Partitioning II

    [抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文. 返回s符合要求的的最少分割次数. [思维问题]: 不知道要用预处理字符串降低复杂度 [一句话思路]: 先把预处理获得s中回文串的 ...

  5. LeetCode 132. 分割回文串 II(Palindrome Partitioning II)

    题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s ...

  6. [Swift]LeetCode132. 分割回文串 II | Palindrome Partitioning II

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  7. 132 Palindrome Partitioning II 分割回文串 II

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 符合要求的的最少分割次数.例如,给出 s = "aab",返回 1 因为进行一次分割可以将字符串 s 分 ...

  8. 132. 分割回文串 II

    Q: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: “aab” 输出: 1 解释: 进行一次分割就可将 s 分割成 [“aa”,“b ...

  9. 分割回文串 · Palindrome Partitioning

    [抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 给出 s = "aab",返回 [ ["aa", & ...

  10. LeetCode 131. 分割回文串(Palindrome Partitioning)

    131. 分割回文串 131. Palindrome Partitioning 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. LeetC ...

随机推荐

  1. oracle中lock和latch的用途

    本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁吗?只是翻译不同而以?研究过后才知道两者有很大 ...

  2. Python常用的数据类型

    Python常用的数据类型有很多,今天暂时介绍这三种,int(整数类型).str(字符串).bool(布尔类型)一.int(整数类型)1.不带小数的,integer 的缩写,常用于数据的计算或者大小的 ...

  3. 让微信内置浏览器兼容clipboard.js 复制粘贴 ios 安卓

    <!--js copy事件--><script type="text/javascript" src="/static/js/clipboard.min ...

  4. Ansible自动化配置详解

    第1章 Ansible基本概述 1.1 ansible是一个配置管理系统configuration management system, 你只需要可以使用ssh访问你的服务器或设备就行. 1.安装软件 ...

  5. 操作BOM

    BOM的作用是将相关的元素组织包装起来,提供给程序设计人员使用,从而降低开发人员的劳动量,提高设计Web页面的能力. 整个window对象是整个BOM的核心. 通过BOM可实现的功能: 弹出新的浏览器 ...

  6. 【ospf-基础配置】

    ospf开放最短路径优先基本配置{ ospf cost :配置ospf接口的优先级 ospf dr-priority :配置路径花费值 ospf router_id:创建ospf的进程号 area a ...

  7. vue服务端渲染添加缓存

    缓存 虽然 Vue 的服务器端渲染(SSR)相当快速,但是由于创建组件实例和虚拟 DOM 节点的开销,无法与纯基于字符串拼接(pure string-based)的模板的性能相当.在 SSR 性能至关 ...

  8. vue入门笔记

    Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与 ...

  9. PHP一些常用魔术方法

    魔术方法                          调用方法                                     作用__set                   有两个 ...

  10. pig分组统计例子

    1.选取数据样本 在pig安装目录下有一个文件tutorial/data/excite-small.log,其中的数据分为3列,中间用制表符分隔,第一列为用户ID,第二列为Unix时间戳,第三列为查询 ...