zoukankan      html  css  js  c++  java
  • LeetCode 算法题之PalindromePartition

    一个string对象,将其进行划分成若干子字符串,要求每一字符串都是回文的(即正着读和倒着读是一样的)。设计一个算法,返回所有可能的字符串。

    初步分析这个问题,要对每一个自字符串再次划分,所以非常适合递归。算法如下:

    class Solution {
    public:
        vector<vector<string>> partition(string s) {
            vector<vector<string>>result;
            if(s=="")
            return result;
            result=part(s);
    
            return result;
        }
    private:
        vector<vector<string>> part(string s)
        {
            vector<vector<string>>result;
            int length=s.size();
            vector<string> single;
            for(int index=0;index<length;index++)
            {
                single.push_back(s.substr(index,1));
            }
            result.push_back(single);
    
            for(int index=0;index<length;index++)//注意index=0;要从单个字符做起,因为单个字符也是回文的;我最开始把单个字符的情况单独列出,这样是不妥的
            {
                if(s[index]==s[0]&&isPalindrome(s.substr(0,index+1)))//如果s[index]!=s[0],可以确定0到index的字符串不是回文的
                {
                    string lResult=s.substr(0,index+1);
                    if(index!=length-1)
                    {
                        vector<vector<string>> rResult=part(s.substr(index+1,length-index));
                        int rLen=rResult.size();
                        for(int rIndex=0;rIndex<rLen;rIndex++)
                        {
                            vector<string> result1;
                            result1.push_back(lResult);
                            for(int rIndex2=0;rIndex2<rResult[rIndex].size();rIndex2++)
                            {
                                result1.push_back(rResult[rIndex][rIndex2]);
                            }
                            result.push_back(result1);
                        }
                    }
                    else
                    {
                        vector<string> result1;
                        result1.push_back(lResult);
                        result.push_back(result1);
                    }
                }
            }
            return result;
        }
        bool isPalindrome(string s)
        {
            for(int start=0,end=s.size()-1;start<end;start++,end--)
            {
                if(s[start]!=s[end])
                {
                    return false;
                }
            }
            return true;
        }
    };
  • 相关阅读:
    Boost练习程序(multi_index_container)
    mathematica练习程序(图像取反)
    【转】媒体播放器三大底层架构
    CentOS安装中文支持
    Retrofit2文件上传下载及其进度显示
    Andorid面试问题整理
    5分钟实现Android中更换头像功能
    Android中突发情况Activity数据的保存和恢复
    5分钟让你学会用最高效的工具解析所有Json
    android http 和https请求
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3538446.html
Copyright © 2011-2022 走看看