zoukankan      html  css  js  c++  java
  • LeetCode(131)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"]
      ]
    

     

     

    Subscribe to see which companies asked this question。

    分析

            给定一个字符串,将其分割为若干个回文子串集合。每个集合中的所有元素均为回文串,且元素连接结果为源串。
            题目类似于之前遇到过的求全集或全排列,考察点均为回溯的思想。对于一个字符串,可以对这个字符串进行遍历,如果前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测试程序源码








  • 相关阅读:
    第二部分 高数_9 优化
    第二部分 高数_8 泰勒公式、麦克劳林公式和线性化
    第二部分 高数_7 二元符合函数的求导法则
    第二部分 高数_6 高阶偏导数
    第二部分 高数_5 多元函数的导数
    第二部分 高数_4 函数的积分
    第二部分 高数_3 函数的微分
    第二部分 高数_2 导数
    第二部分 高数_1 极限
    第一部分 现代_4 特征值和特征向量
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214699.html
Copyright © 2011-2022 走看看