java - 存储二进制字符串的所有可能序列,Java

标签 java algorithm dynamic-programming

用途:给定一个二进制字符串作为输入,存储将字符串中的所有 1 切换为所有可能组合中的 1 和 0 所产生的字符串。

示例给定一个二进制字符串“110”,每个“1”值都可以切换为“1”或“0”。 “0”值必须保留为“0”并且顺序很重要。

字符串 011 产生: [011, 010, 001, 000]

字符串 101 产生: [101, 100, 001, 000]

字符串 111 产生: [111, 110, 101, 100, 011, 010, 001, 000]

我面临的问题:当给定字符串“111”时,我的代码不会存储每个相应子序列的所有可能组合。

我的代码的输出

Set:110 [110]
Set:011 [011, 010, 001, 000]
Set:000 [000]
Set:111 [111, 110, 101, 100, 011, 010, 001, 000]
Set:100 [100]
Set:001 [001, 000]
Set:101 [101, 100]
Set:010 [010]

有几个例子,他们没有将所有可能的组合存储到哈希中:010(不包含 000)、101(不包含 000 或 001)。

当函数最初输入“111”时,111、011、001 都正确存储了组合。

代码:

public static List<String> subsequence(char [] set, HashMap<String,List<String>> hs, int position){
    List<String> listOfSubsequence = new ArrayList<String>();

    // Dynamic programming part
    if (hs.containsKey(String.valueOf(set))){
        return hs.get(String.valueOf(set));
    }

    // base case
    else if (position >= set.length ){
        listOfSubsequence.add(String.valueOf(set));
        hs.put(String.valueOf(set), listOfSubsequence);
        return listOfSubsequence;
    } 

    else if (set[position] == '0'){
        return(subsequence(set,hs,position + 1));
    }
    else{
        // Last situation where we have a 1 at position we're looking at
        listOfSubsequence.addAll(subsequence(set,hs,position + 1));
        set[position] = '0';
        listOfSubsequence.addAll(subsequence(set,hs,position));
        set[position] = '1';

        hs.put(String.valueOf(set), listOfSubsequence);
        return listOfSubsequence;
    }
}

最佳答案

有一个位技巧可以枚举给定位掩码的所有子掩码

sub = mask;
while (sub) {
    output sub
    sub = (sub - 1) & mask;
    //clears LSB, sets trailing 0s, removes bits not presenting in mask
}
output sub  ////zero one

对于掩码5(二进制101),此伪代码给出输出5,4,1,0(二进制101, 100, 001, 000)

关于java - 存储二进制字符串的所有可能序列,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948798/

相关文章:

java - 从 URL 正则表达式 java 中提取数字

Java fx tableview 在设置新项时抛出空指针异常

java - PreLoader 的多线程 - JavaFX

algorithm - GUID 或 GUID 的 SHA1 哈希值之间发生冲突的可能性更大吗?

algorithm - JAVA - 确定 n 的所有质因数的递归函数

python - 即使基本情况是完美的,递归也不会终止

java - 每个 BufferedWriter 实例只有一个 FileWriter 实例?

c++ - 在(任意大)流中搜索精确的字符串匹配 - C++

arrays - 你将如何在 Swift 中创建一个具有 n 维的多维数组?

python - Lintcode 中的油漆栅栏 - 超出内存限制的 python 解决方案