Wednesday, September 25, 2013

Pattern matching in a two dimensional matrix

Problem:
You are given a 2D array of characters and a character pattern. WAP to find if pattern is present in 2D array. Pattern can be in any way (all 8 neighbors to be considered) but you can’t use same character twice while matching. Return 1 if match is found, 0 if not.
Java Program:
public class Matrix {
private static boolean[][] visited;
private char[][] grid = {{'a','i','b'},
{'m','b','c'},
{'g','r','i'},
{'o','o','t'},
{'s','f','m'}};
private String searchString = "microsoft";
public static void main(String[] args) {
Matrix gridObject = new Matrix();
gridObject.initialize(gridObject.grid.length, gridObject.grid[0].length);
boolean result = false;
for (int i = 0; i < gridObject.grid.length; i++) {
for(int j = 0; j < gridObject.grid[i].length; j++) {
result = gridObject.traverseAndFind(gridObject.grid, i, j, gridObject.searchString, 0);
if(result) {
break;
}
}
if(result) {
break;
}
}
if(result) {
System.out.println("The string is present in the grid");
}
else {
System.out.println("The string is not present in the grid");
}
}
//Function to do all the primary initialization.
public void initialize(int x, int y) {
visited = new boolean[x][y];
}

public boolean traverseAndFind(char[][] inputGrid, int r, int c, String inputString, int index) {
if(index == inputString.length()) {
return true;
}
else if(r >= 0 && r < inputGrid.length && c >= 0 && c < inputGrid[r].length
&& !visited[r][c] && inputGrid[r][c] == inputString.charAt(index)) {
visited[r][c] = true;
return (traverseAndFind(inputGrid, r, c + 1, inputString, index + 1)) ||
traverseAndFind(inputGrid, r + 1, c + 1, inputString, index + 1) ||
traverseAndFind(inputGrid, r + 1, c, inputString, index + 1) ||
traverseAndFind(inputGrid, r + 1, c - 1, inputString, index + 1) ||
traverseAndFind(inputGrid, r, c - 1, inputString, index + 1) ||
traverseAndFind(inputGrid, r - 1, c - 1, inputString, index + 1) ||
traverseAndFind(inputGrid, r - 1, c, inputString, index + 1) ||
traverseAndFind(inputGrid, r - 1, c + 1, inputString, index + 1);
}
else if(r >= 0 && r < inputGrid.length && c >= 0 && c < inputGrid[r].length) {
visited[r][c] = false;
}
return false;
}
}

No comments:

Post a Comment