leetcode之Palindrome Partitioning
方法一:DFS递归,判断每一个是否为回文数
1,首先要有一个判断字符串是否是回文的函数。容易实现,字符串从两边同时往中间走,看字符是否相同;
2,深度优先搜索思想对字符串进行遍历。得到结果。例如,s = "abacd"; 需要对“a”“ad”“aba”“abac”“abacd”进行深度优先搜索。深度搜索的过程如下:先选“a”,发现“a”是回文,则深度遍历“bacd”,继续深度遍历,“b”也是回文,深度遍历“acd”,继续下去;
同时,深度遍历“a”的同时,也需要深度遍历“ab”,“aba”,“abac”,“abacd”。发现只有“aba”是回文,所以继续深度搜索“cd”。 1 class Solution {
public:
vector<vector<string>> result;
void DFS(string str, vector<string>& curSubStrs, int start, int end)
{
if(start>end)
{
result.push_back(curSubStrs);
return;
}
for(int k=start;k<=end;k++)
{
string r=str.substr(start,k-start+);
if(palindrom(r))
{
curSubStrs.push_back(r);
DFS(str,curSubStrs,k+,end);
curSubStrs.pop_back();
}
}
}
bool palindrom(string r)
{
int n=r.size()-;
int s=;
while(s<n)
{
if(r[s]!=r[n])
return false;
s++;
n--;
}
return true;
}
vector<vector<string>> partition(string s) {
int n=s.size();
result.clear();
if(n<) return result;
vector<string> tmp;
DFS(s,tmp,,n-);
return result;
}
};
方法二:也是递归,只不过是换个方式的方法
//方法二,同样递归,但是只是处理小技巧上方法,其实第一次是想这么做得
class Solution {
public:
vector<vector<string>> res;
vector<vector<string>> partition(string s) {
int n=s.size();
vector<string> tmp;
dfs(s,tmp);
return res;
}
bool palindrom(string r)
{
int n=r.size()-;
int s=;
while(s<n)
{
if(r[s]!=r[n])
return false;
s++;
n--;
}
return true;
}
void dfs(string s,vector<string>&tmp)
{
if(s.size()<) //s是空串
{
res.push_back(tmp);
return;
}
for(int i=;i<s.size();i++)
{
string st=s.substr(,i+); //i+1是长度,从0开始,长度是i+1,其实主要是递归的思想,小的递归和大的递归实际是一样的,所以做题时可以根据最大的递归来想最小的递归是否正确
if(palindrom(st))
{
tmp.push_back(st);
dfs(s.substr(i+),tmp); //没有第一个参数时就是从i+1到组后
tmp.pop_back();
} }
}
}; 方法三:采用动态规划的方法
举例:aabc,这里动态规划是dict[i][j]表示从i到j是否为回文,如果i=0,j=3,就先判断s[i]是否等于s[j],如果j-i<=2,则说明i,j是连着,或一个数,或3个数,如a,ab,aab这种,
只用判断s[i]是否等于s[j]即可,如果j-i>2则判断dict[i+1][j-1]是否为回文,所以以2维数组代表i到j,因为需要先知道后面的,所以要从后向前,又j从题意上是要大于等于i,
所以有:
for(int i=n-1;i>=0;i--)
{
fro(int j=i;j<n;j++)
{
............
}
}
注意substr(start,i-start+1),错了好几次,是从start开始,长度是i-start+1,用substr(start,i+1),是不行的,因为后面start会增加,只有第一个start=0是正确,后面就不对
了如aaabc,start=2时,本来想要a,如果i+1,就成了3,从start开始长度为3就是abc了,所以应该是i-start+1为长度,是1正确.
代码如下:
//方法三,提前采用动态规划,这样可以不用后来每个都递归判断,能减少重复判断
class Solution {
public:
vector<vector<string>> res;
vector<vector<string>> partition(string s) {
int n=s.size();
if(n<=) return res; vector<vector<bool>> dict(n,vector<bool>(n,false));
for(int i=n-;i>=;i--)
{
for(int j=i;j<n;j++)
{
if(s[i]==s[j]&&(j-i<=||dict[i+][j-]))
{
dict[i][j]=true;
}
}
}
vector<string> tmp;
dfs(s,dict,,tmp);
return res;
}
void dfs(string &s,vector<vector<bool>>& dict,int start,vector<string>& tmp)
{
if(start==s.length())
{
res.push_back(tmp);
return;
}
for(int i=start;i<s.length();i++)
{
if(dict[start][i])
{
tmp.push_back(s.substr(start,i-start+));
dfs(s,dict,i+,tmp);
tmp.pop_back();
}
}
} };
leetcode之Palindrome Partitioning的更多相关文章
- [LeetCode] 131. Palindrome Partitioning 回文分割
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- [Leetcode Week13]Palindrome Partitioning
Palindrome Partitioning 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/palindrome-partitioning/desc ...
- Leetcode 131. Palindrome Partitioning
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- 【leetcode】Palindrome Partitioning II(hard) ☆
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- [Leetcode][JAVA] Palindrome Partitioning II
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- 【leetcode】Palindrome Partitioning II
Palindrome Partitioning II Given a string s, partition s such that every substring of the partition ...
- 【leetcode】Palindrome Partitioning
Palindrome Partitioning Given a string s, partition s such that every substring of the partition is ...
- leetcode 132. Palindrome Partitioning II ----- java
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- leetcode之 Palindrome Partitioning I&II
1 Palindrome Partitioning 问题来源:Palindrome Partitioning 该问题简单来说就是给定一个字符串,将字符串分成多个部分,满足每一部分都是回文串,请输出所有 ...
- [LeetCode] 132. Palindrome Partitioning II_ Hard tag: Dynamic Programming
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
随机推荐
- putty实现自动登录的方法(ssh和ssh2)
介绍putty实现自动登录的方法. 1.登录主机并输入ssh-keygen -t rsa 提示Enter file in which to save the key (/root/.ssh/id ...
- [Python][flask][flask-login]关于flask-login中各种API使用实例
本篇博文跟上一篇[Python][flask][flask-wtf]关于flask-wtf中API使用实例教程有莫大的关系. 简介:Flask-Login 为 Flask 提供了用户会话管理.它处理了 ...
- java JDBC操作MySQL数据库
一,首先在MYSQL建立一个数据库,例如Geek99DB: create database Geek99DB; use Geek99DB; 然后建立一个表CustomerTab: create tab ...
- RAC,客户端连接失败ORA-12514
今天上午,某项目运维组的同事过来求助:"某系统的应用有问题了,WEB页面打开以后出现ORACLE的ORA-12514错误,貌似监听有问题了!" 该系统的数据是采用RAC部署的模式, ...
- 导入NGUI插件
在Unity编辑器顶部菜单栏中的Assets菜单中选择Import Package,然后选择Custom Package(自定义资源包),弹出资源路径窗口,在其中找到NGUI资源包所在的位置,单击”打 ...
- 几种C#实现播放声音的方法
在这里介绍使用C#实现播放声音的几种方法,都是利用组件等方法来实现的,有兴趣的话可以看下. 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroS ...
- iOS runloop 资源汇总-b
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...
- 388A Fox and Box Accumulation
一开始贪心策略想错了! #include<cstdio> #include<algorithm> using namespace std; ]; int main() { in ...
- VIM编辑命令的技巧
vim 选择文本,删除,复制,粘贴 文本的选择,对于编辑器来说,是很基本的东西,也经常被用到,总结如下: v 从光标当前位置开始,光标所经过的地方会被选中,再按一下v结束. V 从光标 ...
- 【转】IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
概念很重要,一定要掌握.实践都是基于它们的哟 ~~~~~~~~~~~~~~~~~ http://blog.csdn.net/historyasamirror/article/details/57783 ...