Java字符数组单词搜索谜题:实现单词定位与方向输出方法求助
单词谜题网格的单词搜索实现思路与代码优化建议
看起来你已经搭好了单词搜索的核心框架,用x和y数组对应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 "未找到指定单词";
第三步:方向索引转字符串的辅助方法
因为咱们的x和y数组索引对应固定的方向,所以写个小方法把索引转成你需要的方向字符串:
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




