单词搜索

给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例
给出board =
[
  "ABCE",


  "SFCS",


  "ADEE"
]
word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,

word = "ABCB", -> 返回 false.

import java.util.Scanner;

/**
 * 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例
给出board =
[
  "ABCE",

  "SFCS",

  "ADEE"
]
word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,
word = "ABCB", -> 返回 false.
 * 
 * @author Dell
 *
 */
public class Test123 {
	public static boolean exist(char[][] board, String word)
	{
		   if(word=="")
			   return false;
		   int n=board.length;
		   int m=board[0].length;
		   boolean[][] visited=new boolean[n][m];
	 for(int i=0;i<n;i++)
	 {
		 for(int j=0;j<m;j++)
		 {
			 if(search(board, visited, i, j, word, 0))
				 return true;
		 }
	 }
		return false;
	}
	
	public static boolean search(char[][] board, boolean[][] visited, int row, int col, String word, int start)
	{
		if(start==word.length())
		{
			return true;
		}
		
		boolean result=false;
		if(row>=0&&row<board.length&&col>=0&&col<board[0].length&&visited[row][col]==false&&word.charAt(start)==board[row][col])
		{
			visited[row][col]=true;
			start++;
			
			result=search(board,visited,row-1,col,word,start)||search(board,visited,row,col+1,word,start)||search(board,visited,row+1,col,word,start)
					||search(board,visited,row,col-1,word,start);
			if(result==false)
			{
				visited[row][col]=false;
				start--;
			}
		}
		
		
		return result;
		
	}
	
    public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
	        int n=sc.nextInt();
	        sc.nextLine();
	        String[] s=new String[n];
	        for(int i=0;i<s.length;i++)
	        {
	        	s[i]=sc.nextLine();
	        }
	        char[][] board=new char[n][];
            for(int i=0;i<s.length;i++)
            {
             board[i]=s[i].toCharArray();
            }
            String word=sc.next();
           System.out.println(exist(board,word));
	        
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值