Java中判断两个字符串是否互为排列的方法及代码运行异常求解
Java排列判断代码问题排查
核心错误点
- 循环下标越界:你写的for循环终止条件为
i <= arr1.length、j <= arr2.length,Java数组下标从0开始,最大合法下标为数组长度-1,当循环变量等于数组长度时,访问数组元素会直接抛出ArrayIndexOutOfBoundsException,程序直接崩溃无法输出预期结果。 - 对比逻辑完全错误:你已经提前对两个字符数组做了排序,互为排列的两个字符串排序后相同下标的字符一定完全一致,不需要双层循环比对。你现有双层循环的逻辑是要求arr1的每一个字符和arr2的所有字符都相等,只有当字符串所有字符完全相同时才会返回true,你的测试用例
abcrdt和barcdt排序后为abcdrt和abcdrt,i=0时j=1就会用arr1[0]的a和arr2[1]的b比对,直接返回false,自然不会输出可排列的提示。 - 额外注意:如果运行时提示找不到Arrays类,需要在代码文件头部引入类:
import java.util.Arrays;
修正后的代码
适配原有逻辑的isPermutation方法
static boolean isPermutation(char[] arr1, char[] arr2) { if (arr1.length != arr2.length) { return false; } // 排序后仅需单层循环对比同下标字符 for (int i = 0; i < arr1.length; i++) { if (arr1[i] != arr2[i]) { return false; } } return true; }
优化方案(无需排序,时间复杂度更低)
如果处理的字符串仅包含ASCII字符,可以用计数法降低时间开销:
static boolean isPermutation(String str1, String str2) { if (str1.length() != str2.length()) { return false; } int[] count = new int[128]; for (char c : str1.toCharArray()) { count[c]++; } for (char c : str2.toCharArray()) { count[c]--; if (count[c] < 0) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者SarahLep
相关产品推荐
相关产品推荐

