目的:给定一个二进制字符串作为输入,存储将字符串中的全部1都切换为1和0的所有可能组合所产生的字符串。存储二进制字符串的所有可能序列,Java
示例给定二进制串“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,011,001全都正确地存储组合,当功能最初被赋予“111”作为输入时。
代码:
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;
}
}
似乎是一个家庭作业问题,但想到的一个想法是简单的字符串处理。存储单个“1”的索引,然后您可以简单地为每个排列引入一个递归/迭代解决方案。 – Rogue
这就是我所做的。我注意到,当我递归时,我没有正确存储每个子问题,也找不到原因。我在编程竞赛网站上遇到了类似的问题。 –
使用动态编程标签是不正确的。 DP是基于可以分解成类似子问题的离散决策寻找最优解。这里列举了所有可能的解决方案。这不是DP。 – Gene