详细见:leetcode.com/problems/word-search
Java Solution: github
package leetcode;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
public class P079_WordSearch {
public static void main(String[] args) {
char[][] board = null;
board = new char[][] {
"ABCE".toCharArray(),
"SFES".toCharArray(),
"ADEE".toCharArray(),
};
String word = "ABCESEEEFS";
System.out.println(new Solution3().exist(board, word));
}
/**
* @author zxwtry
* @email zxwtry@qq.com
* @project OJ
* @package leetcode
* @file P079_WordSearch.java
* @type Solution3
* @date 2016年12月8日 下午3:57:13
* @details 31ms 16.54% AC
*/
static class Solution3 {
//不就是一个图遍历嘛
char[] c = null;
boolean[][] iv = null;
boolean[] su = new boolean[] {false};
int[] x = new int[] {-1, 1, 0, 0};
int[] y = new int[] {0, 0, -1, 1};
LinkedList<Integer> xs = new LinkedList<Integer>();
LinkedList<Integer> ys = new LinkedList<Integer>();
public boolean exist(char[][] b, String w) {
if (b == null || b.length == 0)
return w == null || w.length() == 0;
c = w.toCharArray();
iv = new boolean[b.length][b[0].length];
for (int i = 0; i < b.length; i ++) {
for (int j = 0; j < b[0].length; j ++) {
if (b[i][j] == c[0] && ! su[0]) {
se(b, i, j, 0);
Iterator<Integer> itx = xs.iterator();
Iterator<Integer> ity = ys.iterator();
while (itx.hasNext()) {
int ix = itx.next();
int iy = ity.next();
iv[ix][iy] = false;
}
xs.clear();
ys.clear();
}
}
}
return su[0];
}
private void se(char[][] b, int i, int j, int ci) {
xs.add(i);
ys.add(j);
iv[i][j] = true;
if (ci == c.length-1 || su[0]) {
su[0] = true;
return;
}
for (int k = 0; k < x.length; k ++) {
int nx = i + x[k], ny = j + y[k];
if (nx > -1 && nx < b.length && ny > -1 && ny < b[0].length &&
b[nx][ny] == c[ci + 1] && !iv[nx][ny]) {
se(b, nx, ny, ci + 1);
while(xs.size() > ci + 1) {
int px = xs.pollLast();
int py = ys.pollLast();
iv[px][py] = false;
}
}
}
}
}
}
C Solution: github
/*
url: leetcode.com/problems/word-search
AC 36ms 3.33%
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define bool int
bool search(char** b, int ri, int ci, int rn, int cn, char* w, int wi, int wn, char** m) {
bool sign = 0;
if (wi == wn) return 1;
if (ri < 0 || ri >= rn || ci < 0 || ci >= cn) return 0;
if (m[ri][ci] == 1) return 0;
if (b[ri][ci] == w[wi]) {
m[ri][ci] = 1;
sign = search(b, ri+1, ci, rn, cn, w, wi+1, wn, m) ||
search(b, ri, ci+1, rn, cn, w, wi+1, wn, m) ||
search(b, ri-1, ci, rn, cn, w, wi+1, wn, m) ||
search(b, ri, ci-1, rn, cn, w, wi+1, wn, m);
m[ri][ci] = 0;
return sign;
} else return 0;
}
bool exist(char** b, int rn, int cn, char* w) {
char** m = (char**) malloc(sizeof(char*) * rn);
int ri = 0, ci = 0, wn = strlen(w), k = 0, sign = 0;
for (ri = 0; ri < rn; ri ++) {
m[ri] = (char*) malloc(sizeof(char) * (cn+1));
m[ri][cn] = '\0';
}
for (ri = 0; !sign && ri < rn; ri ++) {
for (ci = 0; !sign && ci < cn; ci ++) {
for (k = 0; k < rn ; k ++) memset(m[k], 0, cn);
if (search(b, ri, ci, rn, cn, w, 0, wn, m)) sign = 1;
}
}
for (ri = 0; ri < rn; ri ++) free(m[ri]);
free(m);
return sign;
}
int main() {
char** b = (char**) malloc(sizeof(char*) * 3);
int rn = 3, cn = 4;
b[0] = "ABCE";
b[1] = "SFES";
b[2] = "ADEE";
printf("answer is %d\r\n", exist(b, rn ,cn ,"ABCESEEEFS"));
printf("answer is %d\r\n", exist(b, rn ,cn ,"SEE"));
printf("answer is %d\r\n", exist(b, rn ,cn ,"ABCB"));
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/word-search
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月19日
@details: Solution: 292ms 86.90%
'''
class Solution(object):
def search(self, b, i, j, rn, cn, m, w, wi, wn):
if wi == wn: return True
if i < 0 or i >= rn: return False
if j < 0 or j >= cn: return False
if m[i][j]: return False
if b[i][j] == w[wi]:
m[i][j] = True
a = self.search(b, i-1, j, rn, cn, m, w, wi+1, wn) \
or self.search(b, i, j-1, rn, cn, m, w, wi+1, wn) \
or self.search(b, i+1, j, rn, cn, m, w, wi+1, wn) \
or self.search(b, i, j+1, rn, cn, m, w, wi+1, wn)
m[i][j] = False
return a
else: return False
def exist(self, b, w):
"""
:type b: List[List[str]]
:type w: str
:rtype: bool
"""
wn = 0 if w == None else len(w)
rn = 0 if b == None else len(b)
if rn == 0: return wn == 0
cn = 0 if b[0] == None else len(b[0])
if cn == 0: return wn == 0
m = [[False for j in range(cn)] for i in range(rn)]
for i in range(rn):
for j in range(cn):
if self.search(b, i, j, rn, cn, m, w, 0, wn):
return True
return False