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.
    
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    枚举求解,也叫暴力破解
    多线程之线程的中止
    beginners with the Multithreading programming
    EditBox control Update Problem (A CString type EditBox control in a loop cannot be updated immidiately)
    有关多线程的一些技术问题
    多线程编程基础知识
    VC的若干实用小技巧 (如何干净的删除一个类)
    进入MFC讲坛的前 (Window 程序详细分析)
    Multithreading using MFC in Plain English: Part I
    关于在VS2005环境下无法从源视图切换到设计视图的解决方案
  • 原文地址:https://www.cnblogs.com/siweihz/p/12256864.html
Copyright © 2011-2022 走看看