全排列,直到找到首尾想接的排列 优化:如果一个序列前面的部分不首尾想接,则后面不必计算 class Solution { public: bool endToEnd(vector<string> vstr) { // write code here bool flag = false; //标记是否成功 endToEnd(vstr, 0, flag); return flag; } //交换任意两个字符串获取全排列,start:交换开始的下标 void endToEnd(vector<string> &vstr, int start, bool &flag) { int index = 0; //标记该序列首尾不相接开始的地方 if(judge(vstr, index)) { flag = true; return; } if(index < start) //序列前面的部分不首尾想接,则后面不必计算 return; for(int i = start; i < vstr.size()-1 && !flag; ++i) { for(int j = i+1; j < vstr.size() && !flag; ++j) { swap(vstr[i], vstr[j]); endToEnd(vstr, i+1, flag); //交换回来,比如0,1交换后,下次需要0,2交换,0需要归位 swap(vstr[i], vstr[j]); } } } bool judge(vector<string> &vstr, int &index) { for(int i = 1; i < vstr.size(); ++i) if(vstr[i-1].back() != vstr[i].front()) { index = i; return false; } return true; } };
点赞 评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
牛客网
牛客企业服务