Palindrome Partitioning

题目描述:

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"]
]

使用回溯法,AC代码如下:

class Solution {
public:
    bool isOK(string s)
{
	int n = s.size();
	for (int i = 0, j = n - 1; i < j; ++i, --j){
		if (s[i] != s[j])
			return false;
	}
	return true;
}

vector<vector<string>> partition(string s)
{
	vector<vector<string>> ans;
	int n = s.size();
	if (n == 0) return ans;
	vector<int> lens(n, 0);
	int curPos = 0;
	int index = 0;
	while (index >= 0){
		++lens[index];
		while (curPos + lens[index] <= n && !isOK(s.substr(curPos, lens[index]))){
			++lens[index];
		}
		if (curPos + lens[index] > n){
			lens[index] = 0;
			--index;
			if (index >= 0)
				curPos -= lens[index];
		}
		else{
			curPos += lens[index];
			if (curPos == n){
				int tmpCurPos = 0;
				vector<string> tmpAns;
				for (int i = 0; i <= index; ++i){
					if (lens[i] > 0){
						tmpAns.push_back(s.substr(tmpCurPos, lens[i]));
						tmpCurPos += lens[i];
					}
				}
				ans.push_back(tmpAns);
				curPos -= lens[index];
			}
			else{
				++index;
				lens[index] = 0;
			}
		}
	}
	return ans;
}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值