字符串X位置匹配代码故障排查:EqualX方法为何无法正确识别X?
字符串X位置一致性判断的代码错误分析与修复
问题描述
练习要求实现X位置识别功能:字符串A中所有存在X的位置,字符串B在相同位置必须也有X;反之,B中存在X的位置,A也必须有X。但当前代码无法正确识别这种情况,测试用例"XaXaXaX"和"XeXwXeX"(二者X位置完全对应)本应返回相等,却返回了不相等,需要找出代码中的错误并修复。
原代码
public class Excersize4 { public static boolean EqualX ( String strA, String strB ) { if ( strA.isEmpty() && strB.isEmpty()) { return true; } else if ( strA.isEmpty() && !strB.isEmpty()) { if (strB.charAt(0) != 'X') return EqualX(strA,strB.substring(1)); else return false; } else if (strB.isEmpty() && !strA.isEmpty()) { if (strA.charAt(0) != 'X') return EqualX(strA.substring(1), strB); else return false; } else { if (strA.charAt(0) == 'X' && strB.charAt(0) == 'X') return EqualX(strA.substring(1),strB.substring(1)); else if (strA.charAt(0) == 'X' || strB.charAt(0) != 'X') return false; else if (strA.charAt(0) != 'X' || strB.charAt(0) != 'X') return EqualX (strA.substring(1), strB.substring(1)); else return true; } } public static void main (String[] args) { String strA = "XaXaXaX"; String strB = "XeXwXeX"; if ( EqualX( strA, strB ) ) System.out.println( "\"" + strA + "\" == \"" + strB + "\"" ); else System.out.println( "\"" + strA + "\" != \"" + strB + "\"" ); } }
错误分析
核心错误出现在else分支的条件判断逻辑:
- 第二个else if条件逻辑错误:
strA.charAt(0) == 'X' || strB.charAt(0) != 'X'这个条件几乎总是成立(比如当A当前字符为非X、B当前字符也为非X时,strB.charAt(0) != 'X'为true,整个条件触发),导致合法的非X字符位置直接被判定为不相等,这是测试用例返回错误结果的根本原因。 - 第三个else if条件逻辑错误:
strA.charAt(0) != 'X' || strB.charAt(0) != 'X'使用了逻辑或,会覆盖错误情况(比如A是X而B不是时,这个条件也会成立),应该改为逻辑与,仅当两者当前字符都不是X时才递归处理剩余字符串。
修复后的代码
public class Excersize4 { public static boolean EqualX ( String strA, String strB ) { if ( strA.isEmpty() && strB.isEmpty()) { return true; } else if ( strA.isEmpty() && !strB.isEmpty()) { // A为空时,B剩余字符不能包含X if (strB.charAt(0) != 'X') return EqualX(strA, strB.substring(1)); else return false; } else if (strB.isEmpty() && !strA.isEmpty()) { // B为空时,A剩余字符不能包含X if (strA.charAt(0) != 'X') return EqualX(strA.substring(1), strB); else return false; } else { if (strA.charAt(0) == 'X' && strB.charAt(0) == 'X') { // 两者当前都是X,递归处理剩余部分 return EqualX(strA.substring(1), strB.substring(1)); } else if ((strA.charAt(0) == 'X' && strB.charAt(0) != 'X') || (strB.charAt(0) == 'X' && strA.charAt(0) != 'X')) { // 一方是X另一方不是,直接返回false return false; } else { // 两者都不是X,递归处理剩余部分 return EqualX(strA.substring(1), strB.substring(1)); } } } public static void main (String[] args) { String strA = "XaXaXaX"; String strB = "XeXwXeX"; if ( EqualX( strA, strB ) ) System.out.println( "\"" + strA + "\" == \"" + strB + "\"" ); else System.out.println( "\"" + strA + "\" != \"" + strB + "\"" ); } }
修复说明
- 明确了X位置必须完全对应的判断逻辑:仅当一方为X另一方不为X时返回false
- 修正了递归条件:仅当两者当前字符都不是X时,才递归处理剩余字符串
- 保留了边界条件的正确性:当其中一个字符串为空时,另一个字符串的剩余部分不能包含任何X
内容的提问来源于stack exchange,提问作者Hashir Azeem
相关产品推荐
相关产品推荐

