我正在处理以下问题https://www.hackerrank.com/challenges/reduced-string。
我想以递归方式解决上述问题。我的代码如下。
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(neInputStreamReader(System.in));
String line = br.readLine();
System.out.print(reduce(line));
}
public static String reduce (String str) {
if (str.equals("")) return "Empty String";
if (str.length()<2) return str;
if (str.charAt(0) == str.charAt(1)) return reduce(str.substring(2));
return str.charAt(0) + reduce(str.substring(1));
}
}
上述代码因以下测试用例而失败 BAAB
任何人都可以指出我的代码中存在什么问题吗?
答案 0 :(得分:0)
str.charAt(0)+reduce(str.substring(1));
如果charAt(0)
与str.substring(1)
的第一个字符相等,该怎么办?你完成了未减少的一对。
答案 1 :(得分:0)
你的问题是:
reduce("baab") = 'b' + reduce("aab") = 'b' + reduce("b") = 'b' + 'b' = "bb"
你只能查看你的第一个角色,直到你不能立即删除它为止。然后你永远不会再看它,即使在之后的某个时刻你实际上可以删除它。
我想你可以做这样的事情:
public static String reduce(String str){
if(str.equals(""))
return "Empty String";
if(str.length()<2)
return str;
if(str.charAt(0)==str.charAt(1))
return reduce(str.substring(2));
String rest = str.substring(1);
String reducedRest = reduce(rest);
if (rest.equals(reducedRest))
return str;
else
return reduce(str.charAt(0) + reducedRest);
}
它并不好,但它应该向你展示一般的想法。现在你只忽略第一个字符,如果你不改变其余的。如果你确实改变它,你需要再看一遍。