首页 > 代码库 > LeetCode: Palindrome Partitioning [131]
LeetCode: Palindrome Partitioning [131]
【题目】
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"] ]
【题意】
给定一个字符串s, 要求对s进行划分,划分后每个子串都是回文串。要求返回所有的划分情况
【思路】
直观思路是使用逐层递归,先确定第一个点,然后确定第二个点,再确定第三个点,依次类推,这种方式的时间复杂度非常高。本题使用DP:先计算出任意两个位置i,j之间的子串是否是回文串,用IsPalindrome[i][j]表示。
【代码】
class Solution { public: void getPartition(vector<vector<string> >&result, vector<string>&splits, int start, string&s, vector<vector<bool> >&isPal){ //spits-已切分的结果,start-当前切分开始的位置 if(start==s.length()){ vector<string> newSplits = splits; result.push_back(newSplits); return; } for(int end=start; end<s.length(); end++){ if(isPal[start][end]){ splits.push_back(s.substr(start, end-start+1)); getPartition(result, splits, end+1, s, isPal); splits.pop_back(); } } } vector<vector<string>> partition(string s) { vector<vector<string> >result; int len=s.length(); if(len==0)return result; vector<vector<bool> > isPal(len, vector<bool>(len, false)); //初始化isPal[i][i]=true; for(int i=0; i<len; i++) isPal[i][i]=true; //初始化相邻两位字符构成的子串 for(int i=0; i<len-1; i++) if(s[i]==s[i+1])isPal[i][i+1]=true; //判断其他i<j的位置 for(int i=len-3; i>=0; i--) for(int j=i+2; j<len; j++) isPal[i][j]=(s[i]==s[j]) && isPal[i+1][j-1]; //确定所有的组合 vector<string> splits; getPartition(result, splits, 0, s, isPal); return result; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。