简体   繁体   English

用“X”或“O”迭代地替换每个“#”

[英]Replace each “#” with an “X” or an “O” iteratively

I've been asked to generate all possible combinations of a row where the hidden # squares can be either X or O .我被要求生成所有可能的行组合,其中隐藏的#方块可以是XO I did it recursively but now I have to do an iterative version.我递归地做了,但现在我必须做一个迭代版本。

I tried replacing UnHide(strChar, i+1) with strChar = strChar.substring(0, i+1) , but that doesn't work.我尝试用strChar = strChar.substring(0, i+1)替换UnHide(strChar, i+1) 1) ,但这不起作用。

public static void main(String[] args) {
    String str = new String("XOXX#OO#XO");
    UnHide(str, 0);
}
public static void UnHide(String str, int i) {
    char[] charArr = str.toCharArray();
    String strChar = new String(charArr);
    if (i == charArr.length) {
        System.out.println(charArr);
        return;
    }
    //Replace masked "#" at each specified index by O or X
    if (charArr[i] == '#') {
        for (int j = 0; j < 2; j++) {
            //Replace masked "#" by O
            if (j == 0) {
                charArr[i] = 'O';
                strChar = String.copyValueOf(charArr);
                UnHide(strChar, i + 1); //Call UnHide with an incremented index
                strChar = strChar.substring(0, i + 1);
                charArr[i] = '#';
            }
            //Replace masked "#" by X
            else {
                charArr[i] = 'X';
                strChar = String.copyValueOf(charArr);
                UnHide(strChar, i + 1);
                charArr[i] = '#';
            }
        }
        return;
    }
    UnHide(strChar, i + 1);
}

I am not sure where your code goes wrong, but you can try the following:我不确定您的代码哪里出错了,但是您可以尝试以下方法:

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;
}

Then calling:然后调用:

String str = "XOXX#OO#XO";
System.out.println(UnHide(str));

outputs:输出:

[XOXXOOOXXO, XOXXXOOOXO, XOXXOOOOXO, XOXXXOOXXO]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM