zoukankan      html  css  js  c++  java
  • 刷题79. Word Search

    一、题目说明

    题目79. Word Search,给定一个由字符组成的矩阵,从矩阵中查找一个字符串是否存在。可以连续横、纵找。不能重复使用,难度是Medium。

    二、我的解答

    惭愧,我写了很久总是有问题,就先看正确的写法,下面是回溯法的代码:

    class Solution {
    public:
    	int m,n;
    	//左 上 右 下 
    	int dx[4] = {-1,0,1,0};
    	int dy[4] = {0,1,0,-1};
        bool exist(vector<vector<char>>& board,string word){
        	if(board.empty()||word.empty()){
        		return false;
    		}
        	m = board.size();
        	n = board[0].size();
        	for(int i=0;i<m;i++){
        		for(int j=0;j<n;j++){
        			if(dfs(board,i,j,word,0)){
        				return true;
    				}
    			}
    		}
    		return false;
    	}
    	bool dfs(vector<vector<char>>& board,int x,int y,string&word,int pos){
    		if(word[pos]!=board[x][y]){
    			return false;
    		}
    		if(pos == word.size()-1){
    			return true;
    		}
    		board[x][y] = '.';
    		for(int i=0;i<4;i++){
    			int nx = x + dx[i];
    			int ny = y + dy[i];
    			if(nx<m && nx>=0 && ny<n && ny>=0){
    				if(dfs(board,nx,ny,word,pos+1)){
    					return true;
    				}
    			}
    		}
    		board[x][y] = word[pos];
    		return false;
    	}
    };
    

    性能:

    Runtime: 24 ms, faster than 87.44% of C++ online submissions for Word Search.
    Memory Usage: 9.8 MB, less than 100.00% of C++ online submissions for Word Search.
    

    三、优化措施

    我的思路是用unordered_map<char,vector<vector<int>>> ump;来存储board中所有字符的出现位置,然后从word的第1个开始起查找,用dfs算法(回溯算法)进行匹配,修改并提交了差不多10次,才成功。

    class Solution{
    	public:
    		bool exist(vector<vector<char>>& board,string word){
    			
    			if (board.empty() || word.empty()) {
    	            return false;
    	        }
    			int row = board.size();
    			int col = board[0].size();
    			
    	        if (row * col < word.length()) {
    	            return false;
    	        }
    
    			for(int i=0;i<row;i++){
    				for(int j=0;j<col;j++){
    					char ch = board[i][j];
    					ump[ch].push_back({i,j});
    				}
    			}
    			
    			if(dfs(board,0,0,0,word)){
    				return true;
    			}else{
    				return false;
    			}
    		}
    		bool dfs(vector<vector<char>>& board,int start,int x,int y,string& word){
    			char ch = word[start];
    			bool matched = false; 
    			if(ump.count(ch)){
    				for(auto current: ump[ch]){
    					int row1 = current[0];
    					int col1 = current[1];
    					//是否相邻 
    					if(start==0 || x==row1 && abs(y-col1)==1 || y==col1 && abs(x-row1)==1){
    						if(board[row1][col1]!='.'){
    							board[row1][col1] = '.';
    	
    							if(start<word.size()-1){
    								matched = dfs(board,start+1,row1,col1,word);
    								if(matched) return true;
    							}else if(start==word.size()-1){
    								return true;
    							}
    							
    							board[row1][col1] = ch;
    						}
    					}
    				};
    			}else{
    				return false;
    			}
    
    			return false;
    		};
    	private:
    	    unordered_map<char,vector<vector<int>>> ump;
    };
    

    惭愧的是,性能还不如普通的回溯法:

    Runtime: 764 ms, faster than 5.02% of C++ online submissions for Word Search.
    Memory Usage: 169.2 MB, less than 16.18% of C++ online submissions for Word Search.
    
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/siweihz/p/12256864.html
Copyright © 2011-2022 走看看