You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java字符数组单词搜索谜题:实现单词定位与方向输出方法求助

单词谜题网格的单词搜索实现思路与代码优化建议

看起来你已经搭好了单词搜索的核心框架,用xy数组对应8个方向的偏移量,这个思路非常靠谱!我来帮你把这个实现补全,顺便讲讲关键细节:

首先,先把你给出的代码片段格式化一下,方便后续分析:

public static String wordSearch(int r, int c, String letters, String search){
    // 8个方向的行偏移:对应nw、n、ne、w、e、sw、s、se
    int x[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
    // 8个方向的列偏移:对应nw、n、ne、w、e、sw、s、se
    int y[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
    char [][] puzzle = new char [r][c];
    int count = 0;
    // ... 你的后续代码
}

第一步:把字符串转换成字符矩阵

首先得把传入的letters填充到二维数组里,假设letters是按行优先的顺序(先第一行所有字符,再第二行),咱们可以这样写:

// 填充字符矩阵
for (int i = 0; i < r; i++) {
    for (int j = 0; j < c; j++) {
        puzzle[i][j] = letters.charAt(count++);
    }
}

第二步:遍历起始位置并检查所有方向

接下来,咱们要遍历矩阵里的每一个字符,当遇到和目标单词首字母匹配的位置时,就沿着8个方向逐一检查是否能匹配整个单词:

int searchLength = search.length();
// 处理空单词的特殊情况
if (searchLength == 0) {
    return "搜索单词不能为空";
}

// 遍历所有可能的起始位置
for (int row = 0; row < r; row++) {
    for (int col = 0; col < c; col++) {
        // 找到首字母匹配的位置
        if (puzzle[row][col] == search.charAt(0)) {
            // 尝试8个方向
            for (int dirIndex = 0; dirIndex < 8; dirIndex++) {
                // 先计算当前方向下,单词最后一个字符的位置
                int endRow = row + x[dirIndex] * (searchLength - 1);
                int endCol = col + y[dirIndex] * (searchLength - 1);
                
                // 先判断末尾位置是否在矩阵范围内,避免后续越界
                if (endRow >= 0 && endRow < r && endCol >= 0 && endCol < c) {
                    boolean isMatch = true;
                    // 逐个检查单词的后续字符
                    for (int k = 1; k < searchLength; k++) {
                        int currentRow = row + x[dirIndex] * k;
                        int currentCol = col + y[dirIndex] * k;
                        if (puzzle[currentRow][currentCol] != search.charAt(k)) {
                            isMatch = false;
                            break;
                        }
                    }
                    // 如果匹配成功,返回结果
                    if (isMatch) {
                        String direction = getDirection(dirIndex);
                        return String.format("首字母位置:行%d,列%d,方向:%s", row, col, direction);
                    }
                }
            }
        }
    }
}
// 遍历完没找到匹配的情况
return "未找到指定单词";

第三步:方向索引转字符串的辅助方法

因为咱们的xy数组索引对应固定的方向,所以写个小方法把索引转成你需要的方向字符串:

private static String getDirection(int dirIndex) {
    switch(dirIndex) {
        case 0: return "nw";
        case 1: return "n";
        case 2: return "ne";
        case 3: return "w";
        case 4: return "e";
        case 5: return "sw";
        case 6: return "s";
        case 7: return "se";
        default: return "";
    }
}

一些优化和注意事项

  • 边界检查优先:先判断单词末尾是否在矩阵内,再去检查每个字符,这样能避免不必要的循环,提升效率。
  • 大小写兼容:如果谜题和搜索单词可能有大小写差异,可以统一转成小写(或大写)再比较,比如Character.toLowerCase(puzzle[row][col]) == Character.toLowerCase(search.charAt(0))
  • 多匹配场景:当前代码找到第一个匹配就返回了,如果需要返回所有匹配结果,可以把结果存入List<String>,最后返回拼接后的字符串。
  • 输入合法性校验:可以加个判断,检查letters的长度是否等于r*c,避免填充矩阵时出现IndexOutOfBoundsException

内容的提问来源于stack exchange,提问作者Sinister

火山引擎 最新活动