递归实现判断两个整数数组是否为排列的问题求助
递归判断两个整数数组是否互为排列的问题修复
你的代码核心问题在于逻辑顺序错误,且未处理「匹配当前元素后需验证剩余元素」的递归逻辑:
- 原代码只要发现
a[indexA] == b[indexB]就直接返回true,完全忽略剩余元素的匹配检查; - 前两个
if分支覆盖了所有可能性,递归调用的代码根本不会执行; - 边界条件判断错误,当
indexA等于数组长度时,说明所有元素已匹配完成,应返回true而非false。
正确递归思路
要实现递归判断排列,核心是为每个a中的元素找到b中未被使用过的相等元素,再递归验证剩余元素,需引入标记数组记录b中元素的使用状态,避免重复匹配。
修正后的代码
public class PermutationChecker { // 对外暴露的入口方法 public static boolean isPermutation(int[] a, int[] b) { // 长度不等直接返回false,这是排列的必要条件 if (a.length != b.length) { return false; } // 标记b中元素是否已被匹配使用 boolean[] used = new boolean[b.length]; return isPermutationHelper(a, b, 0, used); } // 递归辅助方法 private static boolean isPermutationHelper(int[] a, int[] b, int indexA, boolean[] used) { // 递归终止:a的所有元素都匹配完成 if (indexA == a.length) { return true; } // 遍历b的所有元素,寻找匹配项 for (int indexB = 0; indexB < b.length; indexB++) { if (!used[indexB] && a[indexA] == b[indexB]) { // 标记当前b元素已使用 used[indexB] = true; // 递归检查a的下一个元素,后续匹配成功则直接返回true if (isPermutationHelper(a, b, indexA + 1, used)) { return true; } // 回溯:当前匹配导致后续失败,取消标记尝试其他元素 used[indexB] = false; } } // 遍历完b都找不到匹配元素,返回false return false; } // 测试示例 public static void main(String[] args) { int[] a = {1,2,3,4}; int[] b = {4,3,2,1}; System.out.println(isPermutation(a, b)); // 输出true } }
代码逻辑说明
- 入口校验:先判断数组长度是否相等,不等直接返回
false,同时初始化标记数组; - 终止条件:当
indexA等于a.length时,说明a的所有元素都在b中找到对应未使用元素,返回true; - 遍历匹配:对a的当前元素,遍历b的每个元素,找到未使用且相等的元素后标记状态,递归验证下一个元素;
- 回溯操作:若递归返回
false,说明当前匹配导致后续无法完成,取消标记继续尝试其他元素。
内容的提问来源于stack exchange,提问作者bar toplian
相关产品推荐
相关产品推荐

