3.30更新

 #include <iostream>
#include <stdio.h>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
int T;cin>>T;
for(int m=;m<T;m++)
{
string s;cin>>s;
sort(s.begin(),s.end());
s.resize(unique(s.begin(),s.end())-s.begin()); int ll=s.size();
int sum=~((-)<<ll)+; set<string> ans;
while(sum-->)
{
string tmp;
for(int d=,i=;i<ll;d=d<<,i++)
if(sum&d) tmp+=s[i];
ans.insert(tmp);
}
printf("case #%d:\n",m);
for(string x:ans)cout<<x<<endl; }
return ;
}

使用位运算更简便,更新排序unique的操作,并且使用set容器。


3.29更新

 #include<bits/stdc++.h>
#define ALL(x) x.begin(),x.end()
using namespace std;
set<string> ans;
string s,ss,ret;
void comb(int n,string s){/*我这个也是递归*/ for(int i=n;i<ss.size();i++){
ans.insert(s+ss[i]);
comb(i+,s+ss[i]);
}
}
int main()
{
int T;cin>>T;
for(int m=;m<T;m++){
cin>>s;
ss=ret=string{};
ans.clear();
sort(ALL(s));
unique_copy(ALL(s),back_inserter(ss));
comb(,ret);
printf("case #%d:\n",m);
for(string x:ans) cout<< x <<endl;
}
return ;
}

用递归方式实现,核心代码只需3行!

既然题目说明ab和ba等价,每次只需要从上一个指定位置向后看就好了。比如递归b的时候就不会从a开始了。

一开始用回溯,加加减减的没有必要,既然递归的局部变量在函数退出时消亡,干脆直接传进去好了。


输入一个由字母组成的字符串 S(1≤长度≤16),按字典序输出由 S 中不同字符组成的所有字符组合(每个组合中的字符也按字典序排列)。

例如:“cbaabc” 中的不同字符是 ‘a’、‘b’、‘c’ 共 3 个,则 1 个字符组成的组合是 “a”、“b”、“c”3 种,2 个字符组成的组合是 “ab”、“bc”、“ac”3 种,3 个字符组成的组合是 “abc”1 种。注意:“ab” 和 “ba” 由相同字符组合而成,因此可认为是同一个组合。那么这个例子共有 7 种组合,按序分别为 “a”、“ab”、“abc”、“ac”、“b”、“bc”、“c”。


 #include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int T;cin>>T;
for(int m=;m<T;m++)
{
int flag[]={};char c;
vector<char> v;
string s;cin>>s;
for(char x:s) v.push_back(x);
sort(v.begin(),v.end());
v.resize(unique(v.begin(),v.end())-v.begin()); int ll=v.size();
long long sum=;
for(int i=;i<ll;i++)
sum+=pow(,i);
vector<string > ans;
for(;sum>=;sum--)
{
string tmp;
for(int i=ll-,d=;i>=;i--,d<<=)
if(sum&d) tmp.insert(tmp.begin(),v[i]);
ans.push_back(tmp);
}
sort(ans.begin(),ans.end());
printf("case #%d:\n",m);
for(int i=;i<ans.size();i++)
cout<<ans[i]<<endl; }
return ;
}

排序去重后二进制枚举即可。

EOJ 3023 字符组合的更多相关文章

  1. JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符

    package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 ...

  2. 华为机试ACM(字符组合问题)

    今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...

  3. js验证:密码只能为大写字母+小写字母+数字的8至15位字符组合

    var reg = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,15}$/; // alert(password); if(reg.test(pa ...

  4. java随机生成字符串(字符随机生成类 生成随机字符组合)

    原文:http://www.jb51.net/article/45006.htm package p2p_web; import java.util.ArrayList; import java.ut ...

  5. PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)

    php正则匹配6到16位的字符串. 只允许包含数字.字母.下划线组成的6到16位字符,符合返回ture,否则返回false. 解答: 6到16位,正则可以这样写:{6,16}. 任意的字符6到16位的 ...

  6. 24.Letter Combinations of a Phone Number(电话号对应的字符组合)

    Level:   Medium 题目描述: Given a string containing digits from 2-9 inclusive, return all possible lette ...

  7. C# 简单的统计指定几个字符组合的所有结果

    比如 用 a,b,c,d 4个字符组成一个8个长度的字符串,问一共有多少可能,应该有4的8次方种,用代码简单实现 private string[] AAA() { string[] cs = { &q ...

  8. LeetCode 17 Letter Combinations of a Phone Number (电话号码字符组合)

    题目链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number/?tab=Description HashMap< ...

  9. 剑指offer-拓展训练-字符的所有组合-全组合

    /* 题目: 给定不含重复字符字符串的全组合. */ /* 思路: 递归法. 例给定abc,输出的组合长度为1,2,3. 对于长度为2的组合,分选择a(ab,ac)和不选择a的情况(bc). 选择a, ...

随机推荐

  1. centos7下手动制作trove镜像

    获取镜像 [root@bldattet1 ~]#  wget http://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64 ...

  2. 控制台——对WIN32 API的使用(user32.dll)

    Win32 API概念:即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface).所有在Win32平台上运行的应用程序都可以调用这些函 ...

  3. 解决richfaces自带的jquery

    项目里有个有史以来让人头疼的问题,就是前端的richfaces框架自带有jquery插件,而且好像总是在最后才加载,导致前面自己加载好的jquery版本的框架以及应用到jquery的其他前端框架生成的 ...

  4. [转载]java中Date,SimpleDateFormat

    一.Java中的日期概述: 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java ...

  5. Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage

    ylbtech-Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage 1.返回顶部 1.1. pack ...

  6. linux常用命令--ubuntu

    linux 操作系统 一.linux 操作系统概述 二.安装linux系统 三.linux系统环境 ubuntu,默认有6个命令交互通道和一个图形界面交互通道,默认进入到的是图形界面通道 命令交互模式 ...

  7. uva 227 Puzzle (UVA - 227)

    感慨 这个题实在是一个大水题(虽然说是世界决赛真题),但是它给出的输入输出数据,标示着老子世界决赛真题虽然题目很水但是数据就能卡死你...一直pe pe直到今天上午AC...无比感慨...就是因为最后 ...

  8. Python类中的 私有变量和私有方法

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  9. linux 头文件和库文件的设置

    GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1]include头文件路径 除了默认的/us ...

  10. nagios新增监控集群、卸载监控集群批量操作

    1.一定要找应用侧确认每台节点上需要监控的进程,不要盲目以为所有hadoop集群的zk.journal啥的都一样,切记! 2.被监控节点只需要安装nagios-plugin和nrpe,依赖需要安装xi ...