热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetcode_212:单词搜索II

题目:我的思路:使用回溯,重要是剪枝,这点可以让程序不用花太多时间做无用功。我的解答:classSolution{publicList&l

题目:
这里写图片描述


我的思路:使用回溯,重要是剪枝,这点可以让程序不用花太多时间做无用功。


我的解答:

class Solution {

    public   List findWords(char[][] board, String words[]) {
        List  finals = new ArrayList<>();
        int used[][] = new int[board.length][board[0].length];
        Map>   unity = new HashMap<>();

        for(int k=0;k position = new ArrayList<>();
            for (int i = 0; i for (int j = 0; j if (word.charAt(0) == board[i][j]) {
                        position.add(i + "--" + j);
                    }
                }
            }

            for (int i = 0; i str[] = position.get(i).split("--");
                int x = Integer.parseInt(str[0]);
                int y = Integer.parseInt(str[1]);

                used[x][y] = 1;//已被使用

                if (move(used, board, x, y, word, 1)) {
                    if(!finals.contains(word)){
                        finals.add(word);
                    }
                    used = new int[board.length][board[0].length];
                }
                used[x][y] = 0;//已被使用
            }
        }
        return finals;
    }

    private static boolean move(int[][] used, char[][] board, int x, int y,String word,int index) {
        if(word.length()>used.length*used[0].length){
            return false;
        }

        if(word.length()==index){
            return true;
        }

        //1是左,2是下,3是→,4是上
        for(int i=1;i<=4;i++){
            switch (i){
                case 1:
                    if(y-1<0){
                        continue;
                    }else if(y-1>=0){
                        if(word.charAt(index)==board[x][y-1]){
                            if(used[x][y-1]==1){
                                continue;
                            }
                            used[x][y-1] = 1;
                            if(move(used,board,x,y-1,word,index+1)){
                                return true;
                            }
                            used[x][y-1] = 0;
                        }else{
                            continue;
                        }
                    }break;
                case 2:
                    if(x+1>=board.length){
                        continue;
                    }else if(x+1if(used[x+1][y]==1){
                            continue;
                        }
                        if(word.charAt(index)==board[x+1][y]){
                            used[x+1][y] = 1;
                            if(move(used,board,x+1,y,word,index+1)){
                                return true;
                            }
                            used[x+1][y] = 0;
                        }else{
                            continue;
                        }
                    }break;
                case 3:
                    if(y+1>=board[0].length){
                        continue;
                    }else {
                        if(word.charAt(index)==board[x][y+1]){
                            if(used[x][y+1]==1){
                                continue;
                            }
                            used[x][y+1] = 1;
                            if(move(used,board,x,y+1,word,index+1)){
                                return true;
                            }
                            used[x][y+1] = 0;
                        }
                    }break;
                case 4:
                    if(x-1<0){
                        continue;
                    }else {
                        if(word.charAt(index)==board[x-1][y]){
                            if(used[x-1][y]==1){
                                continue;
                            }
                            used[x-1][y] = 1;
                            if(move(used,board,x-1,y,word,index+1)){
                                return true;
                            };
                            used[x-1][y] = 0;
                        }
                    }break;
            }
        }
        return false;
    }

}

这种类型的题目,我一眼看到就用了回溯法,可能剪枝不够好吧,或者也许有更好的解法,导致解这一题花了952ms,挺长时间的。如果有更好的解法,还请大神不啬教诲。


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
mobiledu2502874965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有