Leetcode: Palindrome Partition I II

 

题目一, 题目二

 

 

思路

1. 第一遍做时就参考别人的, 现在又忘记了 做的时候使用的是二维动态规划, 超时加超内存

 

2. 只当 string 左部分是回文的时候才有可能减少 cut

 

3. 一维动规. 令 cuts[i] 表示string[i, string.size()] 所需的切割数, 那么

状态转移方程为 cuts[i] = min(cuts[j]+1) j > i && string[i, j] is palindrome

时间复杂度上仍是 o(n*n), 但更新 cuts 的限制条件比较多了, cuts[i] 更新频率较低 

 

代码:

超时二维动规代码

#include <iostream>
#include <memory.h>
using namespace std;int cuts[1000][1000];
int palindrom[1000][1000];
const int INFS = 0x3f3f3f3f;
class Solution {
public:int minCut(string s) {memset(cuts, 0x3f, sizeof(cuts));memset(palindrom, 0x3f, sizeof(palindrom));int curcuts = countCuts(s,0,s.size()-1);return curcuts;}int countCuts(string &s, int i, int j) {if(j <= i) return 0;if(isPalindrome(s,i,j))return (cuts[i][j]=0);if(cuts[i][j] != INFS)return cuts[i][j];int curcuts = INFS;for(int k = i; k < j; k++) {curcuts = min(curcuts, 1+countCuts(s,i,k)+countCuts(s,k+1,j));}return (cuts[i][j]=curcuts);}bool isPalindrome(string &s, int i, int j) {if(palindrom[i][j] == 1)return true;if(j <= i)return (palindrom[i][j] = true);if(palindrom[i][j] == 0)return false;return (palindrom[i][j] = (s[i]==s[j] && isPalindrome(s,i+1,j-1)));}
};int main() {string str = "apjesgpsxoeiokmqmfgvjslcjukbqxpsobyhjpbgdfruqdkeiszrlmtwgfxyfostpqczidfljwfbbrflkgdvtytbgqalguewnhvvmcgxboycffopmtmhtfizxkmeftcucxpobxmelmjtuzigsxnncxpaibgpuijwhankxbplpyejxmrrjgeoevqozwdtgospohznkoyzocjlracchjqnggbfeebmuvbicbvmpuleywrpzwsihivnrwtxcukwplgtobhgxukwrdlszfaiqxwjvrgxnsveedxseeyeykarqnjrtlaliyudpacctzizcftjlunlgnfwcqqxcqikocqffsjyurzwysfjmswvhbrmshjuzsgpwyubtfbnwajuvrfhlccvfwhxfqthkcwhatktymgxostjlztwdxritygbrbibdgkezvzajizxasjnrcjwzdfvdnwwqeyumkamhzoqhnqjfzwzbixclcxqrtniznemxeahfozp";cout << str.size() << endl;cout << (new Solution())->minCut(str) << endl;return 0;
}

  

优化后的一维动规

#include <iostream>
#include <memory.h>
using namespace std;int cuts[1500];
int palindrom[1500][1500];
const int INFS = 0x3f3f3f3f;
class Solution {
public:int minCut(string s) {memset(cuts, 0x3f, sizeof(cuts));memset(palindrom, 0x3f, sizeof(palindrom));int curcuts = countCuts(s,0,s.size()-1);return curcuts;}int countCuts(string &s, int i, int j) {if(j <= i) return 0;if(isPalindrome(s,i,j))return 0;if(cuts[i] != INFS)return cuts[i];int curcuts = INFS;for(int k = i; k < j; k++) {if(isPalindrome(s,i,k))curcuts = min(curcuts, 1+countCuts(s,k+1,j));}return (cuts[i]=curcuts);}bool isPalindrome(string &s, int i, int j) {if(palindrom[i][j] == 1)return true;if(j <= i)return (palindrom[i][j] = true);if(palindrom[i][j] == 0)return false;return (palindrom[i][j] = (s[i]==s[j] && isPalindrome(s,i+1,j-1)));}
};int main() {string str = "bb";cout << str.size() << endl;cout << (new Solution())->minCut(str) << endl;return 0;
}

  

I

第一题用动态规划也是可以做的, 不过会比较麻烦(与Word Break类似)

这里用 dfs 加打印路径, 比较直观

int palindrom[1500][1500];
vector<vector<string> > res;
class Solution {
public:vector<vector<string>> partition(string s) {res.clear();memset(palindrom, 0x3f, sizeof(palindrom));vector<string> tmp;dfs(s, tmp, 0);return res;}bool isPalindrome(string &s, int i, int j) {if(palindrom[i][j] == 1)return true;if(j <= i)return (palindrom[i][j] = true);if(palindrom[i][j] == 0)return false;return (palindrom[i][j] = (s[i]==s[j] && isPalindrome(s,i+1,j-1)));}void dfs(string &s, vector<string> cur_vec, int depth) {if(depth == s.size()) {res.push_back(cur_vec);return;}for(int i = depth; i < s.size(); i ++) {if(isPalindrome(s, depth,i)) {cur_vec.push_back(s.substr(depth,i-depth+1));dfs(s, cur_vec, i+1);cur_vec.pop_back();}}}
};

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FatMouse

时间限制&#xff1a;1 秒 内存限制&#xff1a;128 兆 特殊判题&#xff1a;否 提交&#xff1a;1431 解决&#xff1a;641 题目描述&#xff1a;FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food…

linux之安装Clion和运行使用总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1、Clion的简单介绍 CLion是以IntelliJ为基础,专为开发C及C++所设计的跨平台IDE,可以在Windows、Linux及MacOS使用,这里我是在ubuntu 16.0.4基础上安装。 2、linux平台…

Tips

1.Unity\Editor\Data\Resources\ScriptTemplates 里的文件是Unity 生成文件的模板. 2.提示文件尾不一致.用VS打开Unity\Editor\Data\Resources\ScriptTemplates里的模板文件.文件->高级保存选项->Windows(CRLF) 3.Scene视图里选择Transform工具,按V可以通过Pivot对齐 4.N…

体验 正式发布 的OSM v1.0.0 版本

2021年10月份发布了OSM 1.0 RC[1]&#xff0c;在过去的几个月里&#xff0c;OSM 的贡献者一直在努力为 v1.0.0 版本的发布做准备。2022年2月1日&#xff0c;OSM 团队正式发布 1.0.0 版本[2]。OSM 从最初的发布到现在已经走了很长的路&#xff0c;团队继续专注于社区需要的关键和…

linux c之用命名管道实现进程通信

1、命名管道相关信息介绍 不是很了解命名管道先看这个篇博客 http://blog.csdn.net/u011068702/article/details/55102379 linux c之命名管道简单使用 博客介绍了创建管道的方法,这里还需要介绍 open函数和调用阻塞 FIFO文件也可以使用open调用来打开,mkfifo函数只是创建…

vue表格刷新数据_Vue.js+Layer表格数据绑定与实现更新的实例

一&#xff1a;先使用Vue.js绑定好数据与更新事件使用v-on绑定好事件,在事件里边直接把该行数据传递进去&#xff0c;在更新方法里边就可以直接取出需要更新的数据选择用户名学号班级操作{{item.UserName}}{{item.Number}}{{item.Class}}删除更新//实例化vue.js(用来给表格提供…

数据流图的画法

数据流图的画法 数据流图也称为数据流程图date flow diagram , DFD&#xff0c;是一种便于用户理解和分析系统数据流程的图形工具&#xff0c;他摆脱了系统和详细内容&#xff0c;精确的在逻辑上描写叙述系统的功能、输入、输出和数据存储等&#xff0c;是系统逻辑模型的重要组…

linux之自己总结学习linux的资源推荐

1、学习linux前辈的网站 安卓和linux网络编程 http://www.cnblogs.com/hnrainll/ IBM学习linux技术地址: https://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp 2、学习linux的途径,或者说过程 1、APUE再深读 – 尤其是进程,线程,IPC,套接字 2、 多…

01-算法简介

数据结构和算法 基于《算法图解》—Aditya Bhargava和《数据结构》—严蔚敏 ** 算法图解&#xff1a;(基于Python)* 第1章—算法简介 1.1 引言 算法是一组完成任务的指令。 1.2 二分查找&#xff08;binary_search&#xff09; 二分查找是一种算法&#xff0c;其输入是一个…

浏览器渲染机制面试_【前端面试必考题】页面渲染机制(一)

页面渲染机制这部分内容会分成两篇来进行讲解&#xff0c;这两篇里我们准备聊一下页面的渲染的过程&#xff0c;包括页面的加载、DOM 树的构建、CSSOM 树的构建、渲染树的构建和最后的渲染过程等。浏览器的渲染机制和网页的优化息息相关&#xff0c;只有知道了页面是怎么渲染出…

OpenJudge/Poj 1226 Substrings

1.链接地址&#xff1a; http://bailian.openjudge.cn/practice/1226/ http://poj.org/problem?id1226 2.题目&#xff1a; 总时间限制:1000ms内存限制:65536kB描述You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, s…

MFC继承表

转载于:https://www.cnblogs.com/Lthis/p/4264967.html

linux之fdisk查看分区和mkfs.ext3删除分区和mount挂载和e2label添加卷标使用总结

一、使用fdisk、mkfs.ext3、和mount、e2lable的原因 有个分区挂载不上,然后需要格式化分区,还需要添加卷标 二、fdisk、mkfs.ext3、mount、e2lable命令介绍 1、fdisk命令介绍 1)、了解分区 分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个…

Task+ConcurrentQueue多线程编程

队列&#xff08;Queue&#xff09;代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时&#xff0c;则使用队列。当您在列表中添加一项&#xff0c;称为入队&#xff0c;当您从列表中移除一项时&#xff0c;称为出队。ConcurrentQueue<T>队列是一个高效的…

怎样从一个手机上安两个不同版本的软件_怎么在一部手机上安装两个不同版本的微信?...

今天我们就向大家介绍一个非常简便的方法&#xff0c;帮助我们实现在Android智能手机将应用程序多开。1、安卓微信双卡方法&#xff1a;准备工作从上图我们可以看到&#xff0c;小编在自己的手机上已经安装了两个不同版本的微信。通常在自己的手机上安装同一应用程序时&#xf…

牛人的英语学习方法

牛人的英语学习方法&#xff1a; 总结1&#xff1a;背出来的单词 不背熟单词就去学所谓的听力阅读作文语法&#xff0c;就像没学走路就想学跑步&#xff0c;没吃饭就想拉屎&#xff0c;没脱牛仔裤就想脱内裤一样的痴心妄想。所以想学英语的人要做的第一件事&#xff0c;不是哭&…

02-选择排序

数据结构和算法 基于《算法图解》—Aditya Bhargava和《数据结构》—严蔚敏 第2章 2.1 内存的工作原理 计算机就像是很多抽屉的集合体&#xff0c;每个抽屉都有地址。需要将数据存储到内存是&#xff0c;请求计算机提供存储空间&#xff0c;计算机则分配一个地址。需要存储多…

[SAP ABAP开发技术总结]权限对象检查

20.14. 权限检查 AT SELECTION-SCREEN. DATA: BEGIN OF lt_bukrs OCCURS 0, bukrs TYPE t001-bukrs, END OF lt_bukrs. SELECT bukrs FROM t001 INTO CORRESPONDING FIELDS OF TABLE lt_bukrs WHERE bukrs IN s_bukrs. LOOP AT lt_bukrs. AUTHORITY-C…

linux c之strncpy函数和strncmp函数最简单使用总结

1.原型声明&#xff1a; char * strncpy(char *dest,const char *src, size_t n); strncmp() 用来比较两个字符串的前n个字符&#xff0c;区分大小写&#xff0c;其原型为&#xff1a; int strncmp ( const char * str1, const char * str2, size_t n ); 若str1与str2的前n…

使用ssh tunnel 来做代理或跳板

接前文 http://www.cnblogs.com/piperck/p/6188984.html 使用ssh config配置文件来管理ssh连接 前文说了如何配置自己的ssh config 来方便的管理自己的ssh连接&#xff0c;以及如何使用ssh-add来将自己密钥密码存储起来。接下将讨论一下使用ssh来做转发和跳板的相关实践。 首先…