LeetCode(131)Palindrome Partitioning

題目

Given a string s, partition s such that every substring of the partition is a palindrome.git

Return all possible palindrome partitioning of s.github

For example, given s = "aab",
Return測試

  [
    ["aa","b"],
    ["a","a","b"]
  ]

 

 

Subscribe to see which companies asked this question。this

分析

        給定一個字符串,將其分割爲若干個迴文子串集合。每一個集合中的全部元素均爲迴文串,且元素鏈接結果爲源串。
        題目相似於以前遇到過的求全集或全排列,考察點均爲回溯的思想。對於一個字符串,能夠對這個字符串進行遍歷,若是前pos個字符串自己是個迴文字符,那麼只須要求解後面的子字符的迴文串便可,因而這個問題被分解成了一個更小的問題。這道題更像一個分治法的題,將問題規模不斷縮小,固然的遍歷字符串的過程當中須要進行回溯。

AC代碼

class Solution {
public:
	vector<vector<string>> partition(string s) {
		if (s.empty())
			return vector<vector<string>>();
		int len = s.length();
		if (len == 1)
			return vector<vector<string>>(1, vector<string>(1, s));
		else
		{			
			vector<vector<string>> ret;
			int pos = 0;
			while (pos < len)
			{
				if (isPalindrome(s, 0, pos))
				{
					if (pos == len - 1)
					{
						vector<string> tmp;
						tmp.push_back(s.substr(0, pos+1));
						ret.push_back(tmp);
					}
					else{
						/*獲取剩餘子串的全部迴文分隔結果*/
						vector<vector<string>> subRet = partition(s.substr(pos + 1));
						auto iter = subRet.begin();
						while (iter != subRet.end())
						{
							(*iter).insert((*iter).begin(), s.substr(0, pos + 1));
							ret.push_back(*iter);
							++iter;
						}//while						
					}//else
				}//if
				++pos;
			}//while
			return ret;
		}
	}

	/*判斷是否爲迴文串*/
	bool isPalindrome(string str, int beg, int end)
	{
		if (beg <0 || beg > end || end >= str.length())
			return false;
		while (beg < end)
		{
			if (str[beg++] != str[end--])
				return false;
		}//while
		return true;
	}
};
GitHub測試程序源碼
相關文章
相關標籤/搜索