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]