How to generate all permutations of an array in sorted order?

前端 未结 6 1973
挽巷
挽巷 2020-11-29 04:48

I have an array, and the user can insert a string.

And I have this code:

int main(){
  char anagrama[13];
  cin >> anagrama;
  for(int j = 0; j         


        
6条回答
  •  被撕碎了的回忆
    2020-11-29 05:22

    /*Think of this as a tree. The depth of the tree is same as the length of string.
    In this code, I am starting from root node " " with level -1. It has as many children as the characters in string. From there onwards, I am pushing all the string characters in stack.
    Algo is like this:
    
    1. Put root node in stack.
    2. Loop till stack is empty
    2.a If backtracking
    2.a.1 loop from last of the string character to present depth or level and reconfigure datastruture.
    2.b Enter the present char from stack into output char
    
    2.c If this is leaf node, print output and continue with backtracking on.
    2.d Else find all the neighbors or children of this node and put it them on stack. */
    
    
    
            class StringEnumerator
            {
            char* m_string;
            int   m_length;
            int   m_nextItr;
            public:
            StringEnumerator(char* str, int length): m_string(new char[length + 1]), m_length(length)  , m_Complete(m_length, false)
            {
            memcpy(m_string, str, length);
            m_string[length] = 0;
            }
        StringEnumerator(const char* str, int length): m_string(new char[length + 1]), m_length(length)  , m_Complete(m_length, false)
        {
            memcpy(m_string, str, length);
            m_string[length] = 0;
        }
        ~StringEnumerator()
        {
            delete []m_string;
        }
    
        void Enumerate();
       };
    
    
            const int MAX_STR_LEN = 1024;
            const int BEGIN_CHAR = 0;
    
            struct StackElem
            {  
          char Elem;
          int Level;
          StackElem(): Level(0), Elem(0){}
          StackElem(char elem, int level): Elem(elem), Level(level){}
    
            };
    
            struct CharNode
            {
          int Max;
          int Curr;
          int Itr;
          CharNode(int max = 0): Max(max), Curr(0), Itr(0){}
          bool IsAvailable(){return (Max > Curr);}
          void Increase()
          {
            if(Curr < Max)
                Curr++;
          }
          void Decrease()
          {
            if(Curr > 0)
                Curr--;
           }
           void PrepareItr()
          {
            Itr = Curr;
           }
    };
    
    
    
    
            void StringEnumerator::Enumerate()
    {
    
        stack CStack;
        int count = 0;
        CStack.push(StackElem(BEGIN_CHAR,-1));
        char answerStr[MAX_STR_LEN];
        memset(answerStr, 0, MAX_STR_LEN);
    
        bool forwardPath = true;
    
        typedef std::map CharMap;
    
        typedef CharMap::iterator CharItr;
        typedef std::pair CharPair;
    
        CharMap mCharMap;
        CharItr itr;
    
        //Prepare Char Map
        for(int i = 0; i < m_length; i++)
        {
            itr = mCharMap.find(m_string[i]);
            if(itr != mCharMap.end())
            {
                itr->second.Max++;
            }
            else
            {
                mCharMap.insert(CharPair(m_string[i], CharNode(1)));
            }
        }
    
    
        while(CStack.size() > 0)
        {
            StackElem elem = CStack.top();
            CStack.pop();
    
            if(elem.Level != -1)     // No root node
            {
                int currl = m_length - 1;
                if(!forwardPath)
                {
                    while(currl >= elem.Level)
                    {
                        itr = mCharMap.find(answerStr[currl]);
                        if((itr != mCharMap.end()))
                        {
                            itr->second.Decrease();
                        }
                        currl--;
                    }
    
                    forwardPath = true;
                }
    
                answerStr[elem.Level] = elem.Elem;
    
                itr = mCharMap.find(elem.Elem);
                if((itr != mCharMap.end()))
                {
                    itr->second.Increase();
                }
            }
    
            //If leaf node
            if(elem.Level == (m_length - 1))
            {
                count++;
                cout<second.PrepareItr();
                itr++;
            }
    
    
            //Find neighbors of this elem 
            for(int i = 0; i < m_length; i++)
            {
                itr = mCharMap.find(m_string[i]);
                if(/*(itr != mCharMap.end()) &&*/ (itr->second.Itr < itr->second.Max))
                {
                    CStack.push(StackElem(m_string[i], elem.Level + 1));
                    itr->second.Itr++;
                }
            }
    
    
        }
    
    
    }
    

提交回复
热议问题