leetcode131—Palindrome Partitioning
1.原题
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = “aab”,
Return[
[“aa”,”b”],
[“a”,”a”,”b”]
]
意思就是把字符串中,把所有的回文串找出来(任意组合,只需满足回文串的条件即可)。
2.分析
主要是两个步骤:
第一步:用一个二维矩阵
dict[][]来存储是否是回文串的bool值,dict[i][j]==true,表示字符串从索引 i 到索引j 长度为 j−i+1 的子串为回文串。
第二步:有了第一步的信息,接下来的事情就简单多了,直接深搜。
3.代码
class Solution {
private:
vector< vector<bool> >dict;
public:
vector< vector<string> > partition(string s);
void helper(string s,int index,vector<string>tmp,vector <vector<string> >&res);//搜索
void init(string s);//初始化dict
void subPalindrome(string s,int left,int right);//创建dict
};
void Solution::init(string s)
{
vector<bool> tmp(s.size(),false);
for(int i=0;i<s.size();i++)
{
dict.push_back(tmp);
}
}
void Solution::subPalindrome(string s,int left,int right)
{
while(left>=0&&right<s.size()&&s[left]==s[right])
{
dict[left][right]=true;
left --;
right ++;
}
}
void Solution::helper(string s,int index,vector<string>tmp,vector<vector<string> >&res)
{
if(index == s.size())
{
res.push_back(tmp);
return;
}
for(int i=index;i<s.size();i++)
{
if(dict[index][i])
{
tmp.push_back(s.substr(index,i-index+1));
helper(s,i+1,tmp,res);
tmp.pop_back();
}
}
}
vector < vector<string> > Solution::partition(string s)
{
vector < vector<string> > res;
vector<string> tmp;
init(s);
for(int i=0;i<s.size();i++)
{
subPalindrome(s,i,i);//奇
subPalindrome(s,i,i+1);//偶
}
helper(s,0,tmp,res);
return res;
}
本文详细解析了LeetCode 131题——回文串分割问题,介绍了如何通过两步实现解决方案:首先使用二维矩阵判断所有子串是否为回文串,然后采用深度优先搜索算法来找出所有可能的回文串分割。
3185

被折叠的 条评论
为什么被折叠?



