输出一个串的所有可能字符组合,例如输入“abcd“,输出a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd
输入串可能会有重复字符,例如输入”abcc“,输出a,b,c,ab,bc,ac,cc,abc,acc,bcc
输入串可能会有重复字符,例如输入”abcc“,输出a,b,c,ab,bc,ac,cc,abc,acc,bcc
请设计算法和写出代码或伪代码
c++代码如下:
/************************************************************************/
/*一个长度为 n 的串的所有可能字符串组合有2^n个,可用1-2^n逐个转换成对应 */
/*二进制串中1的组合而成。 */
/************************************************************************/
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
vector<string> vecStr;//保存得到的子串
bool contains(string str) //判断vecStr中是否已经存在str,返回bool值
{
if (vecStr.size() == 0) // size为0的情况
{
return false;
}
for (int i = 0; i < (int)vecStr.size(); i++)
{
if (str == vecStr[i])
{
return true;
}
}
return false;
}
void progress(string str)
{
char flag[20];
char temp[20];
for (int i = 1; i < (1<<str.length()); i++)
{
_itoa_s(i,flag,2); //i转换成对应的二进制01串
//将二进制串中的为1的位置对应的字符整合到一个string中,并加入vector中
string s(flag);
int j = 0;
for (int i = 0; i < (int)s.length(); i++) //从后向前遍历 二进制串
{
if(*(s.end()-1-i) == '1')
{
temp[j++] = str.at(str.length() - i - 1);
}
}
temp[j] = '\0';
string ss(temp);
reverse(ss.begin(),ss.end()); //翻转
if (!contains(ss))
{
vecStr.push_back(ss);
}
}
sort(vecStr.begin(),vecStr.end()); //字典序排序,可不加入
for (int i = 0; i < (int)vecStr.size(); i++) //打印
{
cout<<vecStr[i]<<endl;
}
}
int main(){
string str;
cin>>str;
progress(str);
return 0;
}