Java 更换每个“#”;带有“;X”;或“;O”;迭代地

Java 更换每个“#”;带有“;X”;或“;O”;迭代地,java,recursion,iteration,combinations,Java,Recursion,Iteration,Combinations,我被要求生成一行的所有可能组合,其中隐藏的方块可以是X或O。我递归地做了,但现在我必须做一个迭代版本 我尝试将UnHide(strChar,I+1)替换为strChar=strChar.substring(0,I+1),但这不起作用 publicstaticvoidmain(字符串[]args){ String str=新字符串(“XOXX#OO#XO”); 取消隐藏(str,0); } publicstaticvoidunhide(stringstr,inti){ char[]charArr

我被要求生成一行的所有可能组合,其中隐藏的
方块可以是
X
O
。我递归地做了,但现在我必须做一个迭代版本

我尝试将
UnHide(strChar,I+1)
替换为
strChar=strChar.substring(0,I+1)
,但这不起作用

publicstaticvoidmain(字符串[]args){
String str=新字符串(“XOXX#OO#XO”);
取消隐藏(str,0);
}
publicstaticvoidunhide(stringstr,inti){
char[]charArr=str.toCharArray();
字符串strChar=新字符串(charArr);
如果(i==字符长度){
系统输出打印项次(charArr);
返回;
}
//在每个指定索引处用O或X替换遮罩的“#”
if(charArr[i]='#'){
对于(int j=0;j<2;j++){
//用O替换遮罩的“#”
如果(j==0){
charArr[i]=“O”;
strChar=String.copyValueOf(charArr);
UnHide(strChar,i+1);//使用递增的索引调用UnHide
strChar=strChar.子串(0,i+1);
charArr[i]=“#”;
}
//将遮罩的“#”替换为X
否则{
charArr[i]=“X”;
strChar=String.copyValueOf(charArr);
取消隐藏(strChar,i+1);
charArr[i]=“#”;
}
}
返回;
}
取消隐藏(strChar,i+1);
}

我不确定您的代码哪里出错了,但您可以尝试以下方法:

private static final char toReplace = '#';
private static final Set<Character> replacements = new HashSet<>(Arrays.asList('X', 'O'));

private static Set<String> UnHide(String s) {
    Set<String> result = new HashSet<>();
    result.add("");
    for (char c : s.toCharArray()){
        Set<String> updatedResult = new HashSet<>();
        for (String temp : result) {
            if (toReplace == c) {
                for (Character replacement : replacements) {
                    updatedResult.add(temp + replacement);
                }
            } else {
                updatedResult.add(temp + c);
            }
        }
        result = updatedResult;
    }
    return result;
}
产出:

[XOXXOOOXXO, XOXXXOOOXO, XOXXOOOOXO, XOXXXOOXXO]

这回答了你的问题吗?
[XOXXOOOXXO, XOXXXOOOXO, XOXXOOOOXO, XOXXXOOXXO]