Word Search Leetcode Solution  


Кыйынчылык деңгээли орто
Көп суралган Amazon алма Bloomberg ByteDance Cisco Окшош Expedia Facebook Текшерүү Microsoft Oracle Pinterest ServiceNow снэпчат
Алгоритмы Backtracking коддоо интервью интервью даярдоо LeetCode LeetCodeSolutions Matrix

Маселени билдирүү  

Mxn тактасына жана сөзгө ээ болуп, сөздүн тордо бар экендигин табыңыз.

Сөздү катарлаш жанаша турган уячалардын тамгаларынан курууга болот, ал жерде "жанаша" уячалар горизонталдык же тигинен коңшулаш жайгашкан. Бир эле тамга уячасын бир нече жолу колдонууга болбойт.

мисал

board = [["A","B","C","E"],
         ["S","F","C","S"],
         ["A","D","E","E"]],

word = "ABCCED"
true

Explanation:

Word Search Leetcode Solution

board = [["A","B","C","E"],
         ["S","F","C","S"],
         ["A","D","E","E"]], 

word = "ABCB"
false

Мамиле (Backtracking)  

Бул 2D сетка өтүү маселеси, анда биз тордун жанындагы клеткалардын жардамы менен сөздүн түзүлүшү мүмкүн экендигин текшерүү үчүн торду изилдешибиз керек. Бирок DFSди жалпы тор мейкиндигинде аткаруунун ордуна, биз оптикалык түрдө артка чегинүү ыкмасын колдонмокпуз. Артка чегинүү ыкмасында биз ошол максатка дал келген чечимди табуу үчүн гана барабыз. Учурдагы жол чечимге алып келбешин качандыр бир кезде билсек, анда артка кайтып, кийинки тандоого барабыз.

Биз ар бир кадам сайын барган жолубуздагы учурдагы уячаны белгилеп, торду айланып өтөбүз. Ар бир кадамдын аягында биз дагы бир багытты байкап көрүү үчүн таза абалга ээ болушубуз үчүн, анын белгисин алып салабыз.

Word Search Leetcode Solution

Algorithm  

Биз артка чегинүү функциясын аткармакпыз, ал белгилүү бир уячадан башталат жана DFS режиминде тордун жанаша клеткаларын аралап өтөт. Берилген сөз тордун каалаган жеринен баштала тургандыктан, биз тордун бардык уячаларын айланып өтүп, ар бир уяча үчүн ушул учурдагы уячадан баштап артка чегинүү функциясын атайбыз.
Бул артка чегинүү функциясы а рекурсивдүү функциясы, төмөндө бул рекурсивдик функцияны ишке ашыруу кадамдары келтирилген:

  1. Башында биз рекурсиянын түбүнө же базалык учурга жеткенибизди текшеребиз. Эгерде изделүүчү сөз бош болсо же башкача айтканда табылса, анда биз чындыкка кайтып келебиз.
  2. Биздин жолдун учурда жарактуу же жараксыз экендигин текшерип, биз тордун чегинен өткөнбү же учурдагы уяча издөө сөзүнүн биринчи белгисине дал келеби же жокпу, текшеребиз.
  3. Эгер учурдагы кадам жарактуу болсо, анда бул уячаны барган деп белгилеңиз. Жана оң, ылдый, сол жана өйдө клеткалар үчүн ошол эле артка чегинүү функциясын чакырып, төрт багытты изилдей баштаңыз.
  4. Акырында, учурдагы уячага кирбей, чалгындоонун натыйжасын чын же жалган деп кайтарабыз. Эгерде суб-геологиялык чалгындоо ишинин натыйжасы чын болсо, анда биз бул жерден чыныгыга кайтып келебиз, болбосо калп деп кайтарабыз.
ошондой эле
Моррис Траверсал

ишке ашыруу  

Word Search Leetcode Solution үчүн C ++ программасы

#include <bits/stdc++.h>
using namespace std;

int row,col;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

bool backtrack(int i,int j,vector<vector<char>>& board, string word,unsigned int ind)
{
    if(ind>=word.size()) return true;
    if(i<0 || i>=row || j<0 || j>=col || board[i][j]!=word[ind]) return false;

    char t=board[i][j];
    board[i][j]= '#';

    for(int k=0;k<4;k++)
    {
        if(backtrack(i+dx[k],j+dy[k],board,word,ind+1))
            return true;
    }
     board[i][j] = t;
    return false;

}

bool exist(vector<vector<char>>& board, string word) 
{
    row= board.size();
    col= board[0].size();

    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
            if(backtrack(i,j,board,word,0))
                return true;
    return false;
}

int main() 
{
     vector<vector<char>> board= {
            {'A','B','C','E'},
            {'S','F','C','S'},
            {'A','D','E','E'}
        };
    string word = "ABCCED";
    if(exist(board,word))
        cout<< "true" ;
    else
        cout<< "false" ;
    return 0; 
}
true

Word Search Leetcode Solution үчүн Java программасы

class Rextester{
    
  static int row,col;
    static int dx[] = {0, 1, 0, -1};
    static int dy[] = {1, 0, -1, 0};
    
    public static boolean exist(char[][] board, String word)
    {
        row= board.length;
        col= board[0].length;
        
        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++)
                if(backtrack(i,j,board,word,0))
                    return true;
        
        return false;       
    }
    
    static boolean backtrack(int i,int j,char[][] board, String word,int ind)
    {
        if(ind>=word.length()) return true;
        if(i<0 || i>=row || j<0 || j>=col || board[i][j]!=word.charAt(ind)) return false;
        
        char t=board[i][j];
        board[i][j]= '#';
        
        for(int k=0;k<4;k++)
        {
            if(backtrack(i+dx[k],j+dy[k],board,word,ind+1))
                return true;
        }
        
        board[i][j] = t;
        return false;        
    }
    
  public static void main(String args[])
    {
        char[][] board= {
            {'A','B','C','E'},
            {'S','F','C','S'},
            {'A','D','E','E'}
        };
        String word = "ABCCED";
    System.out.println(exist(board,word));
    }
}
true

Word Search Leetcode Solution үчүн татаалдыкты талдоо  

Убакыт татаалдыгы

O (N * (3 ^ L)): бул жерде N - тордогу уячалардын жалпы саны жана L - изделүүчү берилген сөздүн узундугу. Артка чегинүү функциясы үчүн алгач багыттар боюнча 4 тандоону алабыз, бирок андан мурунку кадамда барганда 3кө чейин кыскарган. Бул рекурсивдик функциянын тереңдиги сөздүн узундугуна (L) барабар болот. Демек, эң начар учурда функцияны чакыруунун жалпы саны 3-нар дарагындагы түйүндөрдүн саны болуп калат, болжол менен 3 ^ L.
Жаман учурда, бул функцияны N уячасынан баштайбыз. Демек, убакыттын татаалдыгы O (N * (3 ^ L)) болот.

ошондой эле
Leetcode Solution интервалын кыстарыңыз

Космостун татаалдыгы 

O (L): бул жерде L - берилген сөздүн узундугу. Бул боштук рекурсиялык стек үчүн колдонулат.