非递归方式求字符串的有序排列组合

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <map>

using namespace std;

void GenerateArray(map<string, vector<string> > &msvStr)
{
    bool bOver = false;
    while (1)
    {
        if (bOver)
        {
            break;
        }

        bOver = true;
        bool bUserMsvTemp = false;
        map<string, vector<string> > msvTemp;
        msvTemp.clear();
        map<string, vector<string> >::iterator msvItor;
        for (msvItor = msvStr.begin(); msvItor != msvStr.end(); ++msvItor)
        {
            if (msvItor->first.length() == 1 && msvItor->second.empty())
            {
                msvItor->second.push_back(msvItor->first);
            }
            else if (msvItor->first.length() == 1 && !msvItor->second.empty())
            {
                for (vector<string>::iterator vsItor = msvItor->second.begin(); vsItor != msvItor->second.end(); ++vsItor)
                {
                    *vsItor += msvItor->first;
                }
            }
            else
            {
                bOver = false;
                string sTemp = msvItor->first;
                bUserMsvTemp = true;
                for (size_t index = 0; index < sTemp.length(); ++index)
                {
                    string s = sTemp;
                    s = s.erase(s.find(sTemp[index]), 1);
                    if (msvItor->second.empty())
                    {
                        string sResult = "";
                        sResult = sTemp[index];
                        msvTemp[s].push_back(sResult);
                    }
                    else
                    {
                        for (vector<string>::iterator vsItor = msvItor->second.begin(); vsItor != msvItor->second.end(); ++vsItor)
                        {
                            string sResult = "";
                            sResult = *vsItor + sTemp[index];
                            msvTemp[s].push_back(sResult);
                        }
                    }

                }
            }
        }

        if (bUserMsvTemp)
        {
            msvStr.clear();
            for (map<string, vector<string> >::iterator msvTempItor = msvTemp.begin();
                msvTempItor != msvTemp.end(); ++msvTempItor)
            {
                for (vector<string>::iterator itor = msvTempItor->second.begin();
                    itor != msvTempItor->second.end(); ++itor)
                {
                    msvStr[msvTempItor->first].push_back(*itor);
                }
            }
        }
    }
}

int main(int argc, char **argv)
{
    string str = "123";
    map<string,vector<string> > msvStr;
    msvStr[str].clear();
    GenerateArray(msvStr);

    int index = 0;
    for (map<string,vector<string> >::iterator itor = msvStr.begin(); itor != msvStr.end(); ++itor)
    {
        for (vector<string>::iterator itor2 = itor->second.begin(); itor2 != itor->second.end(); ++itor2)
        {
            ++index;
            printf("%s \n", (*itor2).c_str());
        }
    }
    printf("total: %d\n", index);
    return 0;
}


个人在尝试使用递归方式生成字符串的有序排列组合没能找到好的方法,就想不用递归试试。经验证有效。


转载请注明出处。

猜你喜欢

转载自blog.csdn.net/u011803182/article/details/73786870