131. Palindrome Partitioning

一个字符串,通过不同的切分找到所有切分后的子字符串都是回文的可能性

substr使用的是坐标值,不使用.begin()、.end()这种迭代器

使用dfs,类似于subsets的题,每次判断要不要加入这个数

start每次是起始的位置,判断当前位置到起始位置是不是回文

  1. class Solution {
  2. public:
  3. vector<vector<string>> partition(string s) {
  4. vector<vector<string> > result;
  5. if(s.empty())
  6. return result;
  7. vector<string> res;
  8. int start = ;
  9. partition(s,result,res,start);
  10. return result;
  11. }
  12. void partition(string s,vector<vector<string>>& result,vector<string>& res,int start){
  13. if(start == s.size()){
  14. result.push_back(res);
  15. return;
  16. }
  17. for(int i = start;i < s.size();i++){
  18. if(!ispalindrome(s,start,i))
  19. continue;
  20. res.push_back(s.substr(start,i - start + ));
  21. partition(s,result,res,i+);
  22. res.pop_back();
  23. }
  24. }
  25.  
  26. bool ispalindrome(string s,int start,int end){
  27. while(start < end){
  28. if(s[start++] != s[end--])
  29. return false;
  30. }
  31. return true;
  32. }
  33. };

132. Palindrome Partitioning II

切分字符串,找到最小切分次数让所有的子字符串都是回文

这种方法是否回文和dp一起做了。dp[i]表示当前位置最小的切分次数。

每次先初始化先初始化为要切分i次,然后从前往后找,找到符合的然后更新最小值

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

老方法,这种方法是把所有子串的回文串先存储起来,然后再进行dp

  1. class Solution {
  2. public:
  3. int minCut(string s) {
  4. int length = s.length();
  5. if(length <= )
  6. return ;
  7. vector<vector<bool>> flag(length+,vector<bool>(length+));
  8. for(int i = ;i <= length;i++){
  9. flag[i][i] = true;
  10. if(i < length){
  11. if(s[i-] == s[i])
  12. flag[i][i+] = true;
  13. else
  14. flag[i][i+] = false;
  15. }
  16. }
  17. for(int j = ;j <= length-;j++){
  18. for(int k = ;k <= length-j-;k++){
  19. if(s[k-] == s[k+j] && flag[k+][k+j] == true)
  20. flag[k][k+j+] = true;
  21. else
  22. flag[k][k+j+] = false;
  23. }
  24. }
  25. vector<int> result(length+);
  26. result[] = -;
  27. for(int i = ;i <= length;i++){
  28. result[i] = i-;
  29. for(int j = i-;j >= ;j--){
  30. if(flag[j+][i] == true){
  31. if(result[j] + < result[i])
  32. result[i] = result[j] + ;
  33. }
  34. }
  35. }
  36. return result[length];
  37. }
  38. };

leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II的更多相关文章

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

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

  2. leetcode 266.Palindrome Permutation 、267.Palindrome Permutation II

    266.Palindrome Permutation https://www.cnblogs.com/grandyang/p/5223238.html 判断一个字符串的全排列能否形成一个回文串. 能组 ...

  3. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  4. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  5. leetcode 54. Spiral Matrix 、59. Spiral Matrix II

    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...

  6. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  7. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  8. leetcode 280.Wiggle Sort 、324. Wiggle Sort II

    Wiggle Sort: 注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求. 解法一错误版本: 如果nums的长度是4,这种情况下nums[i+1]会越界.但是如果你用 ...

  9. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

随机推荐

  1. 微信公众号开发--.Net Core实现微信消息加解密

    1:准备工作 进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2:基本配置 设置为安全模式 3.代码实现 ...

  2. AJAX 基本结构 数据加载

    AJAX -- 网页数据异步加载 .ashx 一般处理程序   json 数据格式,在不同的语言之间传递数据 对象格式:     "{"key":"value& ...

  3. Spring Security OAuth2 SSO 单点登录

    基于 Spring Security OAuth2 SSO 单点登录系统 SSO简介 单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自 ...

  4. 【Spring】5、利用自定义注解在SpringMVC中实现自定义权限检查

    转自:http://www.tuicool.com/articles/6z2uIvU 先描述一下应用场景,基于Spring MVC的WEB程序,需要对每个Action进行权限判断,当前用户有权限则允许 ...

  5. I want to learn Android Development, where do I start?

    Question: But I completely have no idea what I wanted to make. I just would like to study android.Wo ...

  6. 算法第四版-文字版-下载地址-Robert Sedgewick

    下载地址:https://download.csdn.net/download/moshenglv/10777447 算法第四版,文字版,可复制,方便copy代码 目录: 第1章 基 础 ...... ...

  7. System.arraycopy 怎么使用的?

    前言:看 ArrayList 的源码,发现 remove 方法主要依赖了 System.arraycopy() 方法实现的.所以需要了解一下这个方法如何使用.转载请注明出处:https://www.c ...

  8. JavaScript初学者必看“new”

    译者按: 本文简单的介绍了new, 更多的是介绍原型(prototype),值得一读. 原文: JavaScript For Beginners: the 'new' operator 译者: Fun ...

  9. 网页三剑客:HTML+CSS+JavaScript 之 HTML的概述

    HTML(超文本标记语言) 什么是HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而 ...

  10. 1474 十进制转m进制

    1474 十进制转m进制  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 将十进制数n转换成m进制数 m ...