非遞迴方式求字串的有序排列組合
阿新 • • 發佈:2018-12-18
#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; }
個人在嘗試使用遞迴方式生成字串的有序排列組合沒能找到好的方法,就想不用遞迴試試。經驗證有效。
轉載請註明出處。