LeetCode079 Word Search

详细见: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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值