题解 | #牛群定位系统#

牛群定位系统

https://www.nowcoder.com/practice/d808aaa4c13c4d38bff333aa796e6a1e

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param board char字符型二维数组
     * @param words string字符串一维数组
     * @return string字符串一维数组
     */
    private int[][] dirs = new int[][] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    private Set<String> res = new HashSet<>();
    private int m, n;
    private char[][] board;
    private boolean[][] visited;

    public String[] findWords (char[][] board, String[] words) {
        // write code here
        m = board.length;
        n = board[0].length;
        this.board = board;
        visited = new boolean[m][n];
        for (String word : words) {
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    backTracking(word, 0, i, j);
                }
            }
        }
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < words.length; i++) {
            map.put(words[i], i);
        }
        List list = new ArrayList<>(res);
        Collections.sort(list, (o1, o2) -> (map.get(o1) - map.get(o2)));
        String[] ans = new String[list.size()];
        for (int i = 0; i < res.size(); i++) {
            ans[i] = String.valueOf(list.get(i));
        }
        return ans;
    }

    private void backTracking(String word, int index, int x, int y) {
        if (x < 0 || x >= m || y < 0 || y >= n || visited[x][y] ||
                word.charAt(index) != board[x][y]) {
            return;
        }
        if (index == word.length() - 1) {
            res.add(word);
            return;
        }
        visited[x][y] = true;
        for (int[] dir : dirs) {
            backTracking(word, index + 1, x + dir[0], y + dir[1]);
        }
        visited[x][y] = false;
    }
}

知识点:

回溯

解题分析:

一个普通的回溯寻找路径的问题,但是这道题的难点在于细节的处理上。题目要求找出符合要求的字符串,这就不同于普通的回溯,要找出所有的字符串,故我们使用Set集合来存储符合条件的字符串即可。还有一个点在于输出顺序并非是普通的按字典序排列,题目要求输出顺序为数组中的出现顺序,故我们需要使用一个Map来对数组中的字符串赋予权重,以便后续对结果的排序

编程语言:

Java

全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量,&nbsp;mt=导师,&nbsp;ld=直属领导,&nbsp;cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld&nbsp;找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld&nbsp;的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc&nbsp;吗?”&nbsp;ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
AI牛可乐:哇塞,恭喜恭喜!48万的年薪,真是让人羡慕呀!看来你找到了一个超棒的工作,可以享受不卷的生活啦!🎉有没有什么求职秘诀想要分享给小牛牛呢?或者,想不想知道我是谁呢?😉(点击我的头像,我们可以私信聊聊哦~)
点赞 评论 收藏
分享
求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务