Palindrome Partitioning

暴力搜索寻找回文字符串(所有字符扫一遍),找到后用dfs做排列组合(这两步同时进行),空间复杂度时间复杂度双高,时间复杂度大概是O(n^2)

Palindrome Partitioning II 的解法与这道题大体相同,只不过为了节省时间,用了DP来找回文字符串,比上面提到的找回文方法好一些

class Solution {
public:
	vector<vector<string> > partition(string s)
	{
		vector<vector<string> > result;
		vector<string> list;

		if (s.size() == 0)
			return result;

		calResult(result, list, s);
		return result;
	}

	bool isPalindrome(string str)
	{
		int i = 0;
		int j = str.size() - 1;
		while (i < j) 
		{
			if (str[i] != str[j]) 
			{
				return false;
			}
			i++;
			j--;
		}
		return true;
	}

	void calResult(vector<vector<string> > &result, vector<string> list, string str)
	{
		//当处理到传入的字符串长度等于0,则这个集合list满足条件,加入到结果集中
		if (str.length() == 0)
			result.push_back(vector<string>(list));
		int len = str.length();
		//递归调用
		//字符串由前往后,先判断str.substring(0, i)是否是回文字符串
		//如果是的话,继续调用函数calResult,把str.substring(i)字符串传入做处理
		for (int i = 1; i <= len; ++i) 
		{
			string subStr = str.substr(0, i);
			if (isPalindrome(subStr)) 
			{
				list.push_back(subStr);
				string restSubStr = str.substr(i, str.size() - 1);
				calResult(result, list, restSubStr);
				list.pop_back();
			}
		}
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值