zoukankan      html  css  js  c++  java
  • 采用位图求数组或者字符串的所有子序列

    /**
     * //采用位图求一个数组的子集
     * //采用位图求一个字符串的所有子序列
     */
    public class Test3 {
        public static void main(String[] args) {
    //        allSub();
              allSub("abc");
        }
    
        private static void allSub() {
            //[] [1] [2] [3] [1,2] [1,3] [2,3] [1,2,3]
            int [] arr = {1,2,3};
            List<List<Integer>> allList = new ArrayList<List<Integer>>();
            int len = arr.length;
            //mask表示的就是所有的可能组合,整数是0到7,用二进制表示就是000 001 010 011 100 101 110 111
            for(int mask = 0; mask < (1<<len); mask++){
                List<Integer> aList = new ArrayList<Integer>();
                //内层循环表示的作用是选出原数组和(比如001)相&后的元素
                for(int i = 0; i < len; i++){
                    if(((1<<i) & mask )!= 0){// 1<<i 表示的是001 010 100,可以得出mask中哪几个是1
                        aList.add(arr[i]);
                    }
                }
                allList.add(aList);
            }
    
            for (List<Integer> list : allList){
                for (Integer i : list){
                    System.out.print(i + " ");
                }
                System.out.println();
            }
        }
    
        private static void allSub(String str) {
            //[] [1] [2] [3] [1,2] [1,3] [2,3] [1,2,3]
            char [] arr = str.toCharArray();
            List<String> allList = new ArrayList<String>();
            int len = arr.length;
            //mask表示的就是所有的可能组合,整数是0到7,用二进制表示就是000 001 010 011 100 101 110 111
            for(int mask = 0; mask < (1<<len); mask++){
                StringBuffer sb = new StringBuffer();
                //内层循环表示的作用是选出原数组和(比如001)相&后的元素
                for(int i = 0; i < len; i++){
                    if(((1<<i) & mask )!= 0){// 1<<i 表示的是001 010 100,可以得出mask中哪几个是1
                        sb.append(arr[i]);
                    }
                }
                allList.add(sb.toString());
            }
    
            for (String s : allList){
                System.out.println(s + " ");
    
            }
        }
    
    }
    

      

  • 相关阅读:
    winform+c#之窗体之间的传值 Virus
    ASP.NET 2.0 利用 checkbox获得选中行的行号, 在footer中显示 Virus
    .NET中的winform的listview控件 Virus
    我的书橱
    Expert .NET 2.0 IL Assembler·译者序一 写在一稿完成之即
    Verbal Description of Custom Attribute Value
    AddressOfCallBacks in TLS
    下一阶段Schedule
    2008 Oct MVP OpenDay 第二天 博客园聚会
    2008 Oct MVP OpenDay 第二天 颁奖·讲座·晚会
  • 原文地址:https://www.cnblogs.com/moris5013/p/12994351.html
Copyright © 2011-2022 走看看