以前学习C语言做过穷举的题目,比如
abc
a,b,c,
ab,bc,ac,ba,cb,ca,aa,bb,cc,
和这个题目有不同的地方,这个题目没有重复字母。我这个字符串太长,效率就会很低。。。
- package myfirsttest;
- public class ExhaustionClass {
- private int Num ;
- int count=0;
- public ExhaustionClass(int num) {
- super();
- Num = num;
- }
- public static void main(String[] args) {
- ExhaustionClass test = new ExhaustionClass(3);
-
- long startTime = System.currentTimeMillis();
-
- test.Method();
-
- long endTime = System.currentTimeMillis();
-
- System.out.println("一共有:"+test.count+"个组合");
- System.out.println("运行时间:" + (endTime - startTime) + "毫秒");
-
- }
- public void Method() {
- for (int i = 0; i < Num;)
- CreateString("", ++i); //穷举所有的
- }
- private void CreateString(String s, int end) {
- if (s.length() < end) // 字母长度是否达到要求
- for (char c = 'a'; c < 'a'+ Num; c++) {
-
- CreateString(s + c, end); // 递归调用下一位原始字符串增加一个字母
- }
- else
- FilterPrint(s); //去掉重复字符后的字符串,如果字符串太长了,效率就不是很高
- // System.out.println(s); //没有去掉重复字母所有的穷举组合。
- // if(!s.matches("regex")){ //可用正则去掉重复字符,效率应该会高一点,目前还不会写。
- // System.out.println(s);
- // }
- }
- private void FilterPrint(String s) {
-
- boolean[] flags = new boolean[26];
-
- char[] buf = s.toCharArray();
- for (char x : buf) {
- boolean flag = flags[x - 'a'];
- if (!flag)
- flags[x - 'a'] = !flag;
- else
- return;
- }
- count++;
- System.out.println(s);
-
- }
- }
复制代码
|