manacher,Sundy,morris算法 C++实现


class Solution
{
public:
    /***************************************************
    *  函数功能:寻找最长回文子串 manacher算法
    *  参数说明
    *       输入参数:
    *       输出参数:
    *  复杂性分析:时间复杂度:O(n),空间复杂度:O(n)
    *  题目来源  :
    *  日期:2018-07-25-16.23
    ***************************************************/
    int manacher(string str)
    {
       if(str.size()<1) return 0;
       string new_str="";
       manacher(str,new_str);
       int length=new_str.size();
       int* pA=new int[length]();
       int index=-1;
       int pR=-1;
       int max_length=-1;
       for(int i=0;ii?min(pA[2*index-i],pR-i):1;
           while(i-pA[i]>-1 && i+pA[i]pR)
           {
               pR=i+pA[i];
               index=i;
           }
           max_length=max(max_length,pA[i]);
       }

       delete[] pA;
       return max_length-1;
    }

private:
    void manacher(string str,string& new_str)
    {
        for(int i=0;ii?min(pA[2*index-i],pR-i):1;
            while(i-pA[i]>-1 && i+pA[i]pR)
            {
                pR=i+pA[i];
                index=i;
            }
            if(pR==length)
            {
                lastR=i;
                break;
            }
        }
        string result="";
        int re_len=2*lastR-length;
        for(int i=re_len;i>0;i-=2)
        {
            result.push_back(new_str[i]);
        }

        delete[] pA;

        return result;
    }
private:
    void shortestEnd(string str,string& new_str)
    {
        for(int i=0;i0 && str[R]!=match[k])
                {
                    k--;
                }
                i=R-k;
                pos=0;
                R=i+match.size();
            }else
            {
                if(pos==match.size()-1)
                {
                    return i-pos;
                }
                pos++;
                i++
            }
        }
        return -1;
    }
};

struct TreeNode
{
    int val;
    TreeNode *left,*right;
    TreeNode(int x):val(x),left(NULL),right(NULL){}
};

class Solution4
{
public:
    /***************************************************
    *  函数功能:morris 先序遍历
    *  参数说明
    *       输入参数:
    *       输出参数:
    *  复杂性分析:时间复杂度:O(n),空间复杂度:O(1)
    *  题目来源  :
    *  日期:2018-07-25-14.47
    ***************************************************/
    void morrisPre(TreeNode* root)
    {
        if(root==NULL) return ;
        TreeNode* curr=root;
        TreeNode* mostRight=NULL;
        while(curr!=NULL)
        {
            mostRight=curr->left;

            if(mostRight!=NULL)
            {
                while(mostRight->right!=NULL && mostRight->right!=curr)
                {
                    mostRight=mostRight->right;
                }
                if(mostRight->right==NULL)
                {
                    mostRight->right=curr;
                    cout<val<<" ";
                    curr=curr->left;

                    continue;
                }else
                {
                    mostRight->right=NULL;
                }
            }else
            {
                cout<val<<" ";
            }
            curr=curr->right;
        }
    }

    /***************************************************
    *  函数功能:morris 中序遍历
    *  参数说明
    *       输入参数:
    *       输出参数:
    *  复杂性分析:时间复杂度:O(n),空间复杂度:O(1)
    *  题目来源  :
    *  日期:2018-07-25-14.47
    ***************************************************/
    void morrisMid(TreeNode* root)
    {
        if(root==NULL) return ;
        TreeNode* curr=root;
        TreeNode* mostRight=NULL;
        while(curr!=NULL)
        {
            mostRight=curr->left;

            if(mostRight!=NULL)
            {
                while(mostRight->right!=NULL && mostRight->right!=curr)
                {
                    mostRight=mostRight->right;
                }
                if(mostRight->right==NULL)
                {
                    mostRight->right=curr;
                    curr=curr->left;
                    continue;
                }else
                {
                    mostRight->right=NULL;
                }
            }

            cout<val<<" ";

            curr=curr->right;
        }
    }

    void digui_Mid(TreeNode* root)
    {
        if(root==NULL)
        {
            return ;
        }
        digui_Mid(root->left);
        cout<val<<" ";
        digui_Mid(root->right);
    }
};


 

你可能感兴趣的:(数据结构与算法)