九度 Online Judge 算法 刷题 题目1369:字符串的排列
2015-08-17 23:32
471 查看
题目1369:字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入:
每个测试案例包括1行。
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
输出:
对应每组数据,按字典序输出所有排列。
样例输入:
abc
BCA
样例输出:
abc
acb
bac
bca
cab
cba
ABC
ACB
BAC
BCA
CAB
CBA
code
java 实现[code]import java.util.*; import javax.rmi.CORBA.Util; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); String a; while (cin.hasNext()) { a = cin.next(); char[] aChar = a.toCharArray(); Arrays.sort(aChar); boolean[] bChar = new boolean[a.length()]; Arrays.fill(bChar, true); dfs(0,a.length(),aChar,new char[a.length()],bChar); } } private static void dfs(int dep, int maxDep, char[] buf, char[] res, boolean[] flagArr) { if (dep == maxDep) { System.out.println(new String(res)); return; } for (int i = 0; i < maxDep; i++) { if (flagArr[i]) { if (i != 0 && buf[i] == buf[i - 1] && flagArr[i - 1]) { // 当有重复的时候 continue; } flagArr[i] = false; res[dep] = buf[i]; dfs(dep + 1, maxDep, buf, res, flagArr); flagArr[i] = true; } } } } /************************************************************** Problem: 1369 User: langzimaizan Language: Java Result: Accepted Time:2980 ms Memory:91744 kb ****************************************************************/
Time Limit Exceed
这道题经常遇到超时错误[code]import java.util.*; import javax.rmi.CORBA.Util; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); String a; while (cin.hasNext()) { a = cin.next(); HashSet<String> list = getStr(a); ArrayList<String> newlist = new ArrayList<String>(list); Collections.sort(newlist); Object[] x = newlist.toArray(); for(int i = 0; i < x.length; i++) System.out.printf("%s\n",x[i].toString()); } } public static HashSet<String> getStr(String data ) { HashSet<String> newlist = new HashSet<String>(); if(data.length() == 0) { newlist.add(""); return newlist; } char c = data.charAt(0); data = data.substring(1); for(String str : getStr(data)) { for(int i = 0; i <= str.length(); i++) newlist.add(insert(str, c , i)); } return newlist; } public static String insert(String str, char c , int i ){ String start = str.substring(0, i); String end = str.substring(i); StringBuilder x = new StringBuilder(start); x.append(c); x.append(end); return x.toString(); } } /************************************************************** Problem: 1369 User: langzimaizan Language: Java Result: Time Limit Exceed ****************************************************************/
相关文章推荐
- 每天五个java相关面试题(3)
- 嵌入式工程师考试总结 fork()函数
- C++的struct和union
- 最高分数记录
- 关闭线程的一些问题
- JAVASCRIPT
- hibernate 级联的选项
- Linux下把U盘格式化为fat32
- Android(客户端)通过socket与QT(服务端)通信
- 合唱队
- Linux下把U盘格式化为fat32
- Scrapy学习笔记(二)
- HDOJ-2094-产生冠军
- Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问
- 面向对象和面向接口编程
- RT-Thread finsh源码分析: finsh_var.c
- 华为OJ(提取不重复的整数)
- 安防基础知识
- Page Hopping
- ErrorRecord