来源
原题来自腾讯WXG,比较两个算数表达式是否相等(只包含26个字母,只有加减)。
思路:
我的想法为先去括号,再用一个Map去统计每个字母(a-z)正负相消后的的个数(字母前面为’+‘就加一,为’-'就减一)。比如,a-a+a-b
最终就是a:1, b:-1
, 最终比较每个字母的计数。
递归去括号过程
public static void main(String[] args) {
String exp = "a-(b-(e-f)+c)";
String ret = removeKH(exp);
System.out.println(ret);
}
public static String removeKH(String exp){
StringBuilder ans = new StringBuilder();
for (int i = 0; i < exp.length(); i++) {
if (exp.charAt(i)!='(')
ans.append(exp.charAt(i));
else {
i = helper(i+1, exp, ans);
}
}
return ans.toString();
}
public static int helper(int idx, String exp, StringBuilder ans){
if (ans.charAt(ans.length()-1)=='-'){
//括号前-
while (exp.charAt(idx)!=')'){
switch (exp.charAt(idx)){
case '-':
ans.append('+');
break;
case '+':
ans.append('-');
break;
case '(':
idx = helper(idx, exp, ans);
break;
default:
ans.append(exp.charAt(idx));
break;
}
++idx;
}
}
else {
idx++;
while (exp.charAt(idx)!=')'){
switch (exp.charAt(idx)){
case '(':
idx = helper(idx, exp, ans);
break;
default:
ans.append(exp.charAt(idx));
break;
}
++idx;
}
}
return idx;
}
输出
a-b+e-f-c