目录

裴先生
裴先生
发布于 2022-04-23 / 0 阅读
0
0

【算法题】找单词

原创

题目描述

给一个字符串和一个二维字符数组,如果该字符串存在于该数组中,则按字符串的字符顺序输出字符串每个字符所在单元格的位置下标字符串,如果找不到返回字符串"N"。

  1. 需要按照字符串的字符组成顺序搜索,且搜索到的位置必须是相邻单元格,其中“相邻单元格”是指那些水平相邻或垂直相邻的单元格。

  2. 同一个单元格内的字母不允许被重复使用。

  3. 假定在数组中最多只存在一个可能的匹配。

题目要求

  • 输入描述:

    1. 第1行为一个数字(N)指示二维数组在后续输入所占的行数。

    2. 第2行到第N+1行输入为一个二维大写字符数组,每行字符用半角,分割。

    3. 第N+2行为待查找的字符串,由大写字符组成。

    4. 二维数组的大小为N*N,0<N<=100。

    5. 单词长度K,0<K<1000。

  • 输出描述:

    输出一个位置下标字符串,拼接格式为:第1个字符行下标+","+第1个字符列下标+","+第2个字符行下标+","+第2个字符列下标...+","+第N个字符行下标+","+第N个字符列下标

示例1

输入

4 A,C,C,F C,D,E,D B,E,S,S F,E,C,A ACCESS

输出

0,0,0,1,0,2,1,2,2,2,2,3

说明

ACCESS分别对应二维数组的[0,0] [0,1] [0,2] [1,2] [2,2] [2,3]下标位置

JAVA解法

import java.util.*;

public class Main {
    static int N;
    static char[][] board;
    static String word;
    static boolean found;
    static String result;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = Integer.parseInt(sc.nextLine().trim());
        board = new char[N][N];
        for (int i = 0; i < N; i++) {
            String[] parts = sc.nextLine().trim().split(",");
            for (int j = 0; j < N; j++) {
                board[i][j] = parts[j].charAt(0);
            }
        }
        word = sc.nextLine().trim();
        sc.close();

        if (word.length() > N * N) {
            System.out.print("N");
            return;
        }

        found = false;
        result = "N";
        boolean[][] visited = new boolean[N][N];

        for (int i = 0; i < N && !found; i++) {
            for (int j = 0; j < N && !found; j++) {
                if (board[i][j] == word.charAt(0)) {
                    visited[i][j] = true;
                    dfs(i, j, 1, visited, new StringBuilder().append(i).append(",").append(j));
                    visited[i][j] = false;
                }
            }
        }
        System.out.print(result);
    }

    private static void dfs(int x, int y, int idx, boolean[][] visited, StringBuilder path) {
        if (found) return;
        if (idx == word.length()) {
            found = true;
            result = path.toString();
            return;
        }
        for (int d = 0; d < 4; d++) {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if (nx >= 0 && nx < N && ny >= 0 && ny < N &&
                !visited[nx][ny] && board[nx][ny] == word.charAt(idx)) {
                visited[nx][ny] = true;
                int oldLen = path.length();
                path.append(",").append(nx).append(",").append(ny);
                dfs(nx, ny, idx + 1, visited, path);
                path.setLength(oldLen);
                visited[nx][ny] = false;
                if (found) return;
            }
        }
    }
}

原创

版权声明:本博客原创文章,由 裴先生 2022年04月23日 发表。
转载说明:除特殊说明外本站文章皆由 CC BY-NC-SA 4.0 协议发布,转载须注明出处。


评论