package com.interview.recursion;
import java.util.ArrayList;
import java.util.List;
/**
* http://www.geeksforgeeks.org/find-all-possible-interpretations/
* This is class fibonacci series example.
* e.g {1,1,1,1} -> when n = 4 total number of ways possible are
* f(3) + f(2).
* Suppose we solved for n =3 . When we add another 1 we know that total number
* of combinations without this 1 doing anything will be f(3). Not if we involve this new 1
* and exclude f(3) we get total of f(2) because think of as if we combined last 2 ones and
* then see how many ways first 2 ones can combine
* example
* {1,1,1, new1}
* f(3) is all combinations without including new1
* Now lets combine {1,1,newnew1} . This gives total of f(2)
* Test cases
* negative number
* 0
* null array
*/
public class PrintArrayInAdjacentWay {
public void printArray(int len,int k){
List<Integer> result = new ArrayList<Integer>();
printArray(len,0,result,k);
}
private void printArray(int len, int pos,List<Integer> result,int k){
if(pos > len){
return;
}
if(pos == len){
for(int i:result){
System.out.print(i + " ");
}
System.out.println();
return ;
}
for(int i=0; i < k ; i++){
result.add(i+1);
printArray(len,pos+i+1,result,k);
result.remove(result.size()-1);
}
}
public int numberOfWaysPossible(int input[],int pos){
if(pos > input.length){
return 0;
}
if(pos == input.length){
return 1;
}
int count = numberOfWaysPossible(input,pos+1);
if(pos + 1 < input.length){
int num = input[pos]*10 + input[pos+1];
if(num < 27){
count += numberOfWaysPossible(input, pos+2);
}
}
return count;
}
/**
* Since we know this is same as fibonacci series all we have to do is either use sum of last two numbers if
* total is less than equal to 26 or use just last number if total is greater than 26
* total is calculated by creating a number from current number and previous number
* @param input
* @return
*/
public int numberOfWaysPossibleFaster(int input[]){
int a0 = 1;
int a1 = 1;
int c = 0;
for(int i=1; i < input.length; i++){
if(input[i] + input[i-1]*10 <=26){
c = a1 + a0;
}else{
c = a1;
}
a0 = a1;
a1 = c;
}
return c;
}
public static void main(String args[]){
PrintArrayInAdjacentWay paw = new PrintArrayInAdjacentWay();
// paw.printArray(5, 2);
int input[] = {1,3,7,7,1,7,2,3,2};
System.out.println(paw.numberOfWaysPossible(input, 0));
System.out.println(paw.numberOfWaysPossibleFaster(input));
}
}