题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a, b, c 所能排列出来的所有字符串
abc, acb, bac, bac, cab和cab。
分析:
这题主要考递归思想。
依次取出每个字符,剩下的字符的字符串所有排列都打印出来,再加上开始的字符。
更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
实现:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<vector> #include <algorithm> using namespace std; vector<string> printallres(string instr) { vector<string> vecres; vecres.clear(); int len = instr.length(); if(len == 1) { vecres.push_back(instr); return vecres; } if( len <= 0) return vecres; vector<char> _tvecdata; _tvecdata.clear(); for(int i = 0; i < len; i++) { vector<char>::iterator it = find(_tvecdata.begin(),_tvecdata.end(), instr[i]); if(it != _tvecdata.end()) continue; _tvecdata.push_back(instr[i]); string tstr(1, instr[i]); int j; string str1 = ""; if(i > 0) str1 = instr.substr(0, i); string str2 = instr.substr(i+1, len - i -1); str1 += str2; vector<string> vecares = printallres(str1); int k = 0; while( k < vecares.size()) { string str3 = tstr + vecares[k]; vecres.push_back(str3); k ++; } } return vecres; } int main(int argc, char* argv[]) { if(argc >= 2) { vector<string> vecstr = printallres(argv[1]); for(int i = 0; i < vecstr.size(); i ++) cout << vecstr[i].c_str() << ","; } return 0; }
编译:
g++ test.cpp -o test
运行:
./test abc
输出:
abc,acb,bac,bca,cab,cba,
增加测试用例(@abamon 朋友的提出的漏洞,修改,并增加的用例):
./test aab
输出:
aab,aba,baa,
作者:csdn博客 hhh3h
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索字符串
, int
, include
, vector
, 字符
INSTR
,以便于您获取更多的相关知识。
时间: 2025-01-19 11:54:27