OnePointThreeAcres Google/April -1


http://www.1point3acres.com/bbs/thread-184034-1-1.html

First Question:

A string consists of ‘0’, ‘1’ and '?'. The question mark can be either '0' or '1'. Find all possible combinations for a string.

01?0  output-->0100, 0110


First question This is very simple DFS:

#include <string>
#include <vector>
#include <iostream>
using namespace std;


void allCombinations(string str, int pos, vector<string>& res, string target) {
    if(target.size() == str.size()) {
        res.push_back(target);
        return;
    }
    for(int i = pos; i < str.size(); ++i) {
        if(str[i] == '?') {
            allCombinations(str, i+1, res, target + '0');
            allCombinations(str, i+1, res, target + '1');
        } else {
            allCombinations(str, i + 1, res, target + str[i]);
        }
    }
}

vector< string > allCombinations(string str) {
    bool exist = false;
    vector<string> res;
    for(int i = 0; i < str.size(); ++i) {
        if(str[i] == '?') {exist = true; break;}
    }
    if(exist == false) {res.push_back(str); return res; }
    else {
        allCombinations(str, 0, res, "");
        return res;
    }
}


// a string only contains 0 and 1 and ?
// substitute the ? with either 0 or 1 and return all possiblities.
// for example:
// 010?1  -> return 01001, 01011

int main(void) {
    vector<string> res = allCombinations("1?0?");
    for(int i = 0; i < res.size(); ++i) {
        cout << res[i] << endl;
 }                                                                                                                                                                         1,1           Top


In this post, there is a very interesting posted. See this piece of code: This will cause repeating because of the bold line. I was first confused about where is the mistake. It is better to draw a graph to show the mistake.

OnePointThreeAcres Google/April -1_第1张图片

        public ArrayList<String> findCombination(String input) {
                ArrayList<String> res = new ArrayList<String>();
                helper(res, 0, "", input);
                return res;
        }
       
        private void helper(ArrayList<String> res, int step, String cur, String input) {
                if(cur.length() == input.length()) {
                        res.add(new String(cur));
                        return;
                }
                for(int i = step; i < input.length(); i++) {
                        if(input.charAt(i) != '?') {
                                <strong>cur += input.charAt(i);</strong>
                                helper(res, i+1, cur, input);
                        } else {
                                helper(res, i+1, cur + "0", input); 
                                helper(res, i+1, cur + "1", input);
                        }
                }
        }


A more elegant way to solve this confusion:

void allCombinations(string str, int pos, vector<string>& res, string target) {
    if(target.size() == str.size()) {
        res.push_back(target);
        return;
    }
    for(int i = pos; i < str.size(); ++i) {
        if(str[i] == '?') {
            allCombinations(str, i+1, res, target + '0');
            allCombinations(str, i+1, res, target + '1');
        } else {
            target = target + str[i];    // if it is not ?, the situation is confirmed.  It doesn't need to go recursion.
        }
    }
}




你可能感兴趣的:(OnePointThreeAcres Google/April -1)