EOJ 3023 字符组合
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 字符组合的更多相关文章
- JAVA----编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
package com.pb.demo.packclass.demo1; import java.util.HashSet; /** * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符 ...
- 华为机试ACM(字符组合问题)
今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...
- js验证:密码只能为大写字母+小写字母+数字的8至15位字符组合
var reg = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,15}$/; // alert(password); if(reg.test(pa ...
- java随机生成字符串(字符随机生成类 生成随机字符组合)
原文:http://www.jb51.net/article/45006.htm package p2p_web; import java.util.ArrayList; import java.ut ...
- PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
php正则匹配6到16位的字符串. 只允许包含数字.字母.下划线组成的6到16位字符,符合返回ture,否则返回false. 解答: 6到16位,正则可以这样写:{6,16}. 任意的字符6到16位的 ...
- 24.Letter Combinations of a Phone Number(电话号对应的字符组合)
Level: Medium 题目描述: Given a string containing digits from 2-9 inclusive, return all possible lette ...
- C# 简单的统计指定几个字符组合的所有结果
比如 用 a,b,c,d 4个字符组成一个8个长度的字符串,问一共有多少可能,应该有4的8次方种,用代码简单实现 private string[] AAA() { string[] cs = { &q ...
- LeetCode 17 Letter Combinations of a Phone Number (电话号码字符组合)
题目链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number/?tab=Description HashMap< ...
- 剑指offer-拓展训练-字符的所有组合-全组合
/* 题目: 给定不含重复字符字符串的全组合. */ /* 思路: 递归法. 例给定abc,输出的组合长度为1,2,3. 对于长度为2的组合,分选择a(ab,ac)和不选择a的情况(bc). 选择a, ...
随机推荐
- php入门学习笔记
学习笔记[6.5-6.13] 1.常用命令 打开数据库格式: mysql -h主机地址 -u用户名 -p 重启nginx:sudo /etc/init.d/nginx restart或者service ...
- Redis系列(一)StackExchange.Redis的使用
Redis系列(一)StackExchange.Redis的使用 一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对 ...
- Tomcat8 连接池
1.所有的tomcat项目共用一个连接池配置 1.1 修改conf->context.xml文件,在Context节点下配置 <Resource name="jdbc/myDat ...
- unable to get system library for the project
当向eclipse导入项目实例后,项目上出现红叉的错误提示,在项目属性里的Java Build Path里发现了错误提示复选选项: unable to get system library for t ...
- 扩增子图表解读6韦恩图:比较组间共有和特有OTU或分类单元
韦恩图 Venn Diagram Venn Diagram,也称韦恩图.维恩图.文氏图,用于显示元素集合重叠区域的图示. 韦图绘制工具 常用R语言的VennDiagram包绘制,输出PDF格式方便 ...
- tidyverse生态链
一套完整的数据分析流程 , 如下图所示 从图中可以看到,整个流程包括读取数据,整洁数据,数据探索和交流部分.经过前两部分, 我们可以得到一个整理好的数据,它的每一行都是一个样本 , 每一列是一个变量. ...
- BZOJ 2096: [Poi2010]Pilots 单调队列
Code: #include<bits/stdc++.h> #define maxn 4000000 using namespace std; void setIO(string s) { ...
- JAVA学习总结-常用数据结构
java中集合框架其实就是数据结构的实现的封装; 参考资料:任小龙教学视频 1,什么是数据结构? 数据结构是计算机存储,组织数据的方式; 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合; ...
- Spring MVC 笔记 概述
学习笔记 模型:封装装程序数据 视图:渲染模型数据,一般来说就是输出HTML 控制:处理请求,构建模型并将其传递给视图进行渲染 以上三者均围绕DispatcherServlet设计,它处理所有的HTT ...
- unigui的菜单树补习【2】treeview
Treeview用于显示按照树形结构进行组织的数据. Treeview控件中一个树形图由节点(TreeNode)和连接线组成.TtreeNode是TTreeview的基本组成单元. ...