package problems.medium;
/**
* Created by sherxon on 1/11/17.
*/
public class WordSearch {
/**
* This is recursive solution without using global variable
* */
boolean exist(char[][] a, String word) {
int r = 1;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if (a[i][j] == word.charAt(0)) {
char temp = a[i][j];
a[i][j] = '.';
r = ex(a, word, 1, i, j);
a[i][j] = temp;
}
if (r == 0) break;
}
if (r == 0) break;
}
return r == 0;
}
private int ex(char[][] a, String word, int n, int i, int j) {
if (n == word.length()) return 0;
int r = 1;
char c = word.charAt(n);
if (j < a[i].length - 1 && a[i][j + 1] == c && r != 0) {
char temp = a[i][j + 1];
a[i][j + 1] = '.';
r *= ex(a, word, n + 1, i, j + 1);
a[i][j + 1] = temp;
}
if (i < a.length - 1 && a[i + 1][j] == c && r != 0) {
char temp = a[i + 1][j];
a[i + 1][j] = '.';
r *= ex(a, word, n + 1, i + 1, j);
a[i + 1][j] = temp;
}
if (j > 0 && a[i][j - 1] == c && r != 0) {
char temp = a[i][j - 1];
a[i][j - 1] = '.';
r *= ex(a, word, n + 1, i, j - 1);
a[i][j - 1] = temp;
}
if (i > 0 && a[i - 1][j] == c && r != 0) {
char temp = a[i - 1][j];
a[i - 1][j] = '.';
r *= ex(a, word, n + 1, i - 1, j);
a[i - 1][j] = temp;
}
return r;
}
/**
* This is cute solution using global variable
* */
class Solution {
private boolean found=false;
public boolean exist(char[][] a, String word) {
char[] s=word.toCharArray();
for(int i=0; i<a.length && !found; i++){
for(int j=0; j<a[i].length && !found; j++){
if(a[i][j]==s[0])
go(a, i, j, s, 0);
}
}
return found;
}
void go(char[][]a, int i, int j, char[] s, int index){
if(i<0 || j<0 || i>=a.length || j>=a[i].length || index >= s.length) return;
if(s[index]!=a[i][j] || found)return;
if(index==s.length-1){
found=true;
return;
}
char temp=a[i][j];
a[i][j]='.';
go(a, i+1, j, s, index+1);
go(a, i, j+1, s, index+1);
go(a, i-1, j, s, index+1);
go(a, i, j-1, s, index+1);
a[i][j]=temp;
}
}
}