首页 > 编程知识 正文

leetcode字符串反转,leetcode单词拆分

时间:2023-05-04 17:42:49 阅读:53856 作者:1496

一、主题说明给出一个m x n二维文字网格board和一个字符串单词word。 如果网格中存在word,则返回true。 否则,返回false。

单词必须按字母顺序由相邻xlmdds中的字符组成。 其中“相邻”xlmdds是水平相邻的xlmdds或垂直相邻的xlmdds。 同一xlmdds中的字符不能重复使用。

示例1 :

输入: board=[['A '、' b '、' c '、' E']、['S '、' f '、' c '、' S']、['A '、' d '、' E']、wood

输出:真

示例2 :

输入: board=[['A '、' b '、' c '、' E']、['S '、' f '、' c '、' S']、['A '、' d '、' E']、wood

输出:真

示例3 :

输入: board=[['A '、' b '、' c '、' E']、['S '、' f '、' c '、' S']、['A '、' d '、' E']、wood

输出: false

提示:

m==board.length

n=board[i].length

1=m,n=6

1=word.length=15

board和word只由大小写组成

二、解题思路函数DFS(I,j,k )表示判断能否从网格的) I,j )的位置检索单词word [ k . ],其中,word [ k . ]表示字符串word为第k个字符如果可以搜索,则返回true;否则返回false。 函数DFS(I,j,k )的执行步骤如下。

如果board[i][j]!=s[k],当前字符不一致,直接返回false。

如果当前正在访问字符串的末尾,且相应的字符匹配,则直接返回true。

否则,遍历当前位置的所有相邻位置。 如果可以从某个相邻位置出发搜索子字符串word[k 1.],则返回true,否则返回false。

因此,在每个位置(I,j )调用函数DFS (I,j,0 )进行检查。 如果在一个位置返回true,则在网格中找到相应的单词,否则就找不到。

为了避免重复遍历同一位置,必须保留其他较大的可视数组(如board ),以确定是否访问了每个位置。 每次遍历相邻位置时,都必须跳过被访问的位置。

三、代码公共类解决方案{ publicbooleanexist (char [ ] board,String word ) { int m=board.length; int n=board[0].length; boolean [ ] [ ]可见性=new boolean [ m ] [ n ]; for(intI=0; im; I ) for(intj=0; jn; j ) )布尔标志=DFS (板,可见,I,j,word,0 ); if(flag ) {返回真; } }返回假; }BooleanDFS(char[][]board,boolean[][] visited,int i,int j,String s,int k ) if ) Board[I][j]!=s.charat(k ) ) {返回假; }elseif(k==s.length(-1 ) { return true; }可视[ I ] [ j ]=true; int [ ] [ ] directions={0,1 }、{ 0,-1}、{ 1,0 }、{-1,0 }; 布尔RS=假; for(int ) ) dir : directions intn ewi=idir (0; int newj=j dir[1]; if (newi=0newiboard.lengthnewj=0newjboard [0].length ) if (! visited [ newi ] [ newj ] (布尔标志=DFS ) Board,visited,newi,newj,s,k 1 ); if(flag ) { rs=true; 布雷克; } } }可视[ I ] [ j ]=false; //回溯返回RS; }公共语音(字符串(args ) char ) ) board={'a '、' b '、' c '、' E'}、{'S '、' f '、' c } stririd 解决方案=new solution (; system.out.println (solution.exist ) word,word ); (四、复杂度分析时间复杂度:非常平缓的上界是o(Mn3(L ),其中m、n是网格的长度和宽度,l是字符串word的长度。 每次调用函数check时,除了可以首先进入四个分支外,剩下的时间最多进入三个分支(每个位置只能使用一次,所以走来的分支不能走回去)。 由于单词长度为l,Check(I,j,0 )的时间复杂度为o )3^L ),执行o ) Mn )次检查。 但是,由于剪枝的存在,遇到不一致或被访问的字符时会提前结束,递归过程结束。 因此,实际时间复杂度远远小于o(Mn3^L )

空间复杂性: o(Mn )。 我们追加开发了o(MN )的可视数组,同时堆栈深度最大为o ) min(L,Mn )。

欢迎拨打微信公众号【算法攻城师】

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。