Java - 递归查找字符串(幂集)的所有子集

2023-12-06

因此,我需要递归地查找给定字符串的所有子集。到目前为止我所拥有的是:

static ArrayList<String> powerSet(String s){
        ArrayList<String> ps = new ArrayList<String>();
        ps.add(s);


        for(int i=0; i<s.length(); i++){
            String temp = s.replace(Character.toString(s.charAt(i)), "");
            ArrayList<String> ps2 = powerSet(temp);
            for(int j = 0; j < ps2.size(); j++){
                ps.add(ps2.get(j));
            }
        }   

        return ps;

我想我现在知道问题是什么,但我不知道如何解决。目前,我找到了temp的所有幂集,分别是“bcd”、“acd”、“abd”、“abc”,这会导致重复。有想法该怎么解决这个吗?

通过 powerset,我的意思是如果字符串是 abc,它将返回“”、“a”、“b”、“c”、“ab”、“ac”、“bc”、“abc”。


The number of subsets of a set with n elements is 2n. If we have, for example, the string "abc", we will have 2n = 23 = 8 subsets.

The number of states that can be represented by n bits is also 2n. We can show there is a correspondence between enumerating all possible states for n bits and all possible subsets for a set with n elements:

   2 1 0   2 1 0
   c b a    bits
0          0 0 0
1      a   0 0 1
2    b     0 1 0
3    b a   0 1 1
4  c       1 0 0
5  c   a   1 0 1
6  c b     1 1 0 
7  c b a   1 1 1

例如,如果我们考虑第 5 行,则位 2 和 0 处于活动状态。如果我们这样做abc.charAt(0) + abc.charAt(2)我们得到子集ac.

To enumerate all possible states for n bits we start at 0, and sum one until we reach 2n - 1. In this solution we will start at 2n - 1 and decrement until 0, so we don't need another parameter just to keep the number of subsets, but the effect is the same:

static List<String> powerSet(String s) {
    // the number of subsets is 2^n
    long numSubsets = 1L << s.length();
    return powerSet(s, numSubsets - 1);
}

static List<String> powerSet(String s, long active) {
    if (active < 0) {
        // Recursion base case
        // All 2^n subsets were visited, stop here and return a new list
        return new ArrayList<>();
    }

    StringBuilder subset = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        // For each bit
        if (isSet(active, i)) {
            // If the bit is set, add the correspondent char to this subset
            subset.append(s.charAt(i));
        }
    }
    // Make the recursive call, decrementing active to the next state,
    // and get the returning list
    List<String> subsets = powerSet(s, active - 1);
    // Add this subset to the list of subsets
    subsets.add(subset.toString());
    return subsets;
}

static boolean isSet(long bits, int i) {
    // return true if the ith bit is set
    return (bits & (1L << i)) != 0;
}

然后你只需要调用它:

System.out.println(powerSet("abc"));

并获取所有 8 个子集:

[, a, b, ab, c, ac, bc, abc]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 递归查找字符串(幂集)的所有子集 的相关文章

随机推荐

  • Bash shell 十进制到二进制以 2 为基数的转换

    我正在 Bash 中寻找一种将十进制数转换为二进制数的简单方法 我有需要转换的变量 ip1 ip2 ip3 ip4 有没有一种简单的方法可以做到这一点 而无需查看每个单独的数字 我宁愿不必编写大量代码 您可以使用bc as echo oba
  • 连接来自位于不同服务器上的多个 SQL Server 数据库的表

    连接位于不同服务器上的数据库上的 SQL Server 数据库表的推荐方法是什么 所有数据库都将位于同一网络上 链接服务器可以工作 但有一些问题让我试图避免它们 随着时间的推移 它们会让从高层管理您的环境变成一场噩梦 服务器来来去去 升级等
  • 如何测试列表是否按升序排序

    这是练习的问题 编写一个函数来检查列表是否按升序排序 def ascending lst for k in range 0 len lst if lst k lt lst k 1 print Ok else print NOk the nu
  • Flask SocketIO 不会向特定房间发送数据

    我正在创建一个程序 该程序从 Flask 应用程序获取数据 并且可以将数据发送到 Flask 应用程序 并且我正在使用 Socket IO 来执行此操作 socketio emit receive data data 当发送到此时 这最终会
  • 表情符号替换 - PHP

    我需要将文本表情符号替换为 html 图像标签 我整理了以下数据 private smile array gt o 3 c gt 8 private laugh array gt D D D 8 D x D X D D D 3 8 priv
  • AutoMapper - 类型的条件映射

    我想做类似以下的事情 我想知道是否有人知道该怎么做 Mapper CreateMap
  • 在phonegap中将base64字符串转换为pdf

    在我的应用程序中 我收到了代表 PDF 的 Base64 字符串 我希望用户能够将 base64 作为 pdf 保存到他的手机上 我一直在寻找科尔多瓦文件传输插件 但需要一个可以下载文件的 服务器 路径 而不是转换 base64 字符串 有
  • swagger.json 路径和定义为空。规范中没有定义操作

    我正在开发一个 net core Web 应用程序 我正在使用 swagger 并且我已经做了所有必要的调整 不幸的是它不起作用 我只是看到No operations defined in spec 在 swagger 输出页面中 swag
  • 如何使手势识别器在动画 UIImage 视图中工作

    我在图像视图中有 5 个动画图像 并且希望允许用户根据默认 ID 点击它们并将其推送到另一个视图 我尝试添加手势点击 但图像视图未检测到 有人可以给我一些建议吗 编辑 最终我没有使用它 而是设置了一个 UIButton 谢谢 viewDid
  • Excel 2013 VBA 清除所有筛选器宏

    看来旧的宏不起作用 我有适当的安全设置来运行 VBA 宏 但是当我尝试了几种清除工作表上所有过滤器的方法时 我收到编译错误 这是我尝试过的 Sub AutoFilter Remove This macro removes any filte
  • React Native 导航:重置堆栈导航器

    我正在使用 React Navigation 5 在顶部有一个抽屉导航器 带有以下屏幕
  • 使用 Python 操作其他程序的 GUI?

    我这里有一个程序 有一个输入框和一个按钮 我希望 python 在输入框中输入一个字符串 然后按下按钮 解决这个问题的最佳方法是什么 顺便说一句 这是针对 Windows 7 的 pyWinAuto 可以很好地解决这个问题 使用它 您可以根
  • 从 x86 应用程序获取 x64 进程主模块位置?

    我正在尝试获取操作系统上正在运行的进程的所有文件路径Process GetProcesses 方法 它在 x64 NET 应用程序下工作得很好 但是如果我尝试从 x86 NET 应用程序迭代进程列表 情况就会发生变化 因为Process M
  • C++ 结构体有默认构造函数吗?

    我写了以下代码片段 void foo struct bar int a bar cout lt lt Value of a is lt lt bar a 并用 g 4 2 1 Mac 编译它 输出是 a 的值为 0 c 中结构体的数据成员总
  • 使用 Java 和 JBoss 进行长轮询

    我正在寻找一个例子 如何在java中实现长轮询机制 我很想使用无状态 EJB 我知道类似的东西会起作用 WebService serviceName mywebservice Stateless public class MyWebServ
  • 在 Java 中连接 2 个三元运算符的结果时,字符串连接无法正常工作

    尊敬的Java大师们 请您解释一下 为什么在 Java 中连接 2 个三元运算符的结果时 字符串连接不能正常工作 Example String str null String x str null A B str null C D Syst
  • 使用 nxlog 使用 om_ssl 将日志从 Windows 发送到 Logstash

    我一直在寻找从 Windows 发送日志的选项 我已经设置了 Logstash 并且目前我使用 Logstash forwarder 和 ssl 加密将日志从 Linux CentOS 服务器发送到我的 ELK 堆栈 出于合规性原因 加密在
  • C - Sprintf 的变量参数?

    我有一个功能 void foo const char format char buffer 1080 Supposed way to handle C Variable Arguments va list argptr va start a
  • PHP数组组合

    我想从集合 0 n 1 生成长度 r 的所有组合 所以输出应该是这样的 n 6 r 2 res array array 0 1 array 0 2 array 0 3 array 0 4 array 0 5 array 1 2 array
  • Java - 递归查找字符串(幂集)的所有子集

    因此 我需要递归地查找给定字符串的所有子集 到目前为止我所拥有的是 static ArrayList