博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 132 Palindrome Partitioning II--In C++
阅读量:4091 次
发布时间:2019-05-25

本文共 1755 字,大约阅读时间需要 5 分钟。

思路:

因为做了上一道Palindrome Partitioning,所以一个很简单粗暴的做法就是在上题基础上修改,然而这注定是要TLE的。因为问题的需求已经不一样了,在这道题中只问切分多少次能够产生所有子串为回文的效果。全程只需要保留一个数字即可。

想到了动态规划。

考虑了很多状态的表示法,都不怎么可行。最后想到了用一个数组cp来表示在字符串s中角标i和i之后的部分需要切cp[i-1]次。

举例来讲,“aab”的边界条件就是cp[2] = 0,因为2所在的位置是'a'(从1开始计数)。含义是a之后的部分“b”需要切0次可以产生全回文的效果。而cp[3] = -1,即b之后的部分(不含b)需要切-1次产生全回文的效果。为什么要等于-1而不是0呢,这要从本算法的工作原理讲起。。。

算法工作过程:

以“aab”为例,先看看它的所有回文串

(0,0)中间为1表示“a”是一个回文串,(0,2)为1,就表示“aab”是一个回文串。这一点在上一题中应该已经明确了。

这时候我们用一个数组cp来记录i之后的所有部分切几次能形成全回文,这就是动态规划的含义了。cp数组要比s中字符个数多一个,因此cp[0]表示从s[0](包含)到s[2](包含)切几次能形成全回文。如本例中cp[0]就是1,表示最少切一次。

从最后一个字符s[i]开始扫,在上表里可以查到所有以s[i]为结尾的回文串,顺便能够得到区间开始的那个字符的角标,例如对于s[2]只有区间[2,2]满足要求,可以得到这个区间起始于s[2],这时候就可以更新一次cp[2]的值。根据cp的含义,cp[2]的值应该等于cp[3]的切分次数加1,加一是因为将[2,2]和[3,X]切开用了一次。这时候可以看到为什么cp[3]要等于-1了,因为b之后已经没有字符了。

还有一点就是cp[i]可能被多个值更新,因此每次更新时取最小值。

int minCut(string s) {	int m = s.size();	if (m == 0){		return 0;	}	bool ** dp = new bool*[m];	for (int i = 0; i < m; i++){		dp[i] = new bool[m];	}	for (int i = m - 1; i >= 0; i--){		for (int j = 0; j < m; j++){			if (i>j){				dp[i][j] = false;				continue;			}			else if (i == j){				dp[i][i] = true;				continue;			}			if (j - i >= 2){//[i,j]要为回文,[i+1,j-1]必须要为回文,且i,j两个字符必须相同				dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];			}			if (j - i == 1){				dp[i][j] = (s[i] == s[j]);			}		}	}	int* cp = new int[m+2];	for (int i = 0; i < m + 2;i++){		cp[i] = 99999999;	}	cp[m] = -1;//s串的最后一个字符,需要切-1次,之后的部分全为回文	cp[m - 1] = 0;//倒数第二个字符,需要切0次,之后的部分全为回文	for (int i = m; i >= 1;i--){		for (int j = i; j >= 1;j--){			if (dp[j-1][i-1]==true){//s[i]和s[j]之间为回文				int val = cp[i] + 1;								cp[j - 1] = val < cp[j - 1] ? val : cp[j - 1];//如果有多个值在更新cp[j-1],取最小的			}		}	}	int result = cp[0];	for (int i = 0; i < m; i++){		delete[] dp[i];	}	delete[]dp;	delete[] cp;	return result;}

你可能感兴趣的文章
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
PX4+激光雷达在gazebo中仿真实现(古月居)
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>