public class Solution {
public List<String> findStrobogrammatic(int n) {
List<String> one = Arrays.asList("0", "1", "8"), two = Arrays.asList(""), r = two;
if(n%2 == 1)
r = one;
for(int i=(n%2)+2; i<=n; i+=2){
List<String> newList = new ArrayList<>();
for(String str : r){
if(i != n)
newList.add("0" + str + "0");
newList.add("1" + str + "1");
newList.add("6" + str + "9");
newList.add("8" + str + "8");
newList.add("9" + str + "6");
}
r = newList;
}
return r;
}
}
public class Solution {
char[][] pairs = new char[][]{{'0', '0'}, {'1', '1'}, {'8', '8'}, {'6', '9'}, {'9', '6'}};
public List<String> findStrobogrammatic(int n) {
List<String> res = new ArrayList<>();
char[] build = new char[n];
dfs(res, build, 0, n - 1);
return res;
}
private void dfs(List<String> res, char[] build, int left, int right){
if(left > right){
String s = new String(build);
res.add(s);
return;
}
for(int i = 0; i < pairs.length; i++){
build[left] = pairs[i][0];
build[right] = pairs[i][1];
if(build.length > 1 && build[0] == '0') continue;
if(left == right){
if(i == 3 || i == 4) continue;
}
dfs(res, build, left + 1, right - 1);
}
}
}
public class Solution {
private char[][] stroNums = {{'0', '0'}, {'1', '1'}, {'8','8'}, {'6', '9'}, {'9', '6'}};
public List<String> findStrobogrammatic(int n) {
List<String> res = new ArrayList<>();
char[] ra = new char[n];
if (n % 2 == 0) {
setResults(res, ra, n/2 - 1);
} else {
ra[n/2] = '1';
setResults(res, ra, n/2 - 1);
ra[n/2] = '8';
setResults(res, ra, n/2 - 1);
ra[n/2] = '0';
setResults(res, ra, n/2 - 1);
}
return res;
}
private void setResults(List<String> res, char[] ra, int pos) {
if (pos < 0) {
res.add(new String(ra));
return;
}
for (char[] sc : stroNums) {
if (pos == 0 && sc[0] == '0') continue;
ra[pos] = sc[0];
ra[ra.length - 1 - pos] = sc[1];
setResults(res, ra, pos - 1);
}
}
}
public class Solution {
private List<String> generate(int left, int amount) {
if (left == 0) return new ArrayList<String>(Arrays.asList(""));
if (left == 1) return new ArrayList<String>(Arrays.asList("0", "1", "8"));
List<String> mid = generate(left - 2, amount);
List<String> res = new ArrayList<>();
for (String s : mid) {
if (left != amount) {
res.add("0" + s + "0");
}
res.add("1" + s + "1");
res.add("6" + s + "9");
res.add("8" + s + "8");
res.add("9" + s + "6");
}
return res;
}
public List<String> findStrobogrammatic(int n) {
return generate(n, n);
}
}