在Java中寻找性能更好的字符串替换解决方案

在Java中寻找性能更好的字符串替换解决方案,java,string,algorithm,data-structures,replace,Java,String,Algorithm,Data Structures,Replace,给定一个只能有字母的字符串输入。如果存在AB、CD、BA、DC的组合,则应通过删除这些匹配项并返回结果字符串来转换字符串。 例如: 输入:ABDCC->输出:C 输入:CABADB->CABD->CD->输出:空字符串 我提出了下面一个使用字符串替换函数的解决方案,但正在寻找一个性能更好的或替代的解决方案。有什么想法吗 公共字符串转换字符串(字符串s){ HashSet stringsToRemove=新HashSet(); stringsToRemove.添加(“AB”); stringsTo

给定一个只能有字母的字符串输入。如果存在AB、CD、BA、DC的组合,则应通过删除这些匹配项并返回结果字符串来转换字符串。 例如:

  • 输入:ABDCC->输出:C
  • 输入:CABADB->CABD->CD->输出:空字符串 我提出了下面一个使用字符串替换函数的解决方案,但正在寻找一个性能更好的或替代的解决方案。有什么想法吗
  • 公共字符串转换字符串(字符串s){
    HashSet stringsToRemove=新HashSet();
    stringsToRemove.添加(“AB”);
    stringsToRemove.添加(“BA”);
    stringsToRemove.add(“CD”);
    stringsToRemove.add(“DC”);
    int prevLength=-1;
    while(prevLength!=s.length()){
    prevLength=s.length();
    用于(字符串d:stringsToRemove){
    s=s。替换(d,“”;
    }
    }
    返回s;
    }
    
    从括号匹配中获取策略并使用堆栈。让您开始的解决方案草图:

    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray()) {
      if (stack.empty()) {
        stack.push(c);
      }
      else {
        char t = stack.peek();
        if (/* t and c match, such as 'A' and 'B' */) {
          stack.pop();
        }
        else {
          stack.push(c);
        }
      }
    }
    
    // Return a string based on what's left in the stack.
    
    Stack Stack=新堆栈();
    for(char c:s.toCharArray()){
    if(stack.empty()){
    堆栈推送(c);
    }
    否则{
    chart=stack.peek();
    if(/*t和c匹配,例如'A'和'B'*/){
    stack.pop();
    }
    否则{
    堆栈推送(c);
    }
    }
    }
    //根据堆栈中剩余的内容返回字符串。
    
    显然,只有当“匹配”没有边缘案例时,这才有效,比如user3386109在他们的评论中提到的案例


    这只会在输入上传递两次(一次在循环中,一次用于展开堆栈以构建输出),因此输入大小的线性时间也是如此。

    问题可能比您想象的更难。例如,考虑要移除的字符串是AB和BC,并且输入是ABCB。您的代码将删除AB和CB。另一种方法是先删除BC,留下AB,然后删除AB,留下一个空字符串。
    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray()) {
      if (stack.empty()) {
        stack.push(c);
      }
      else {
        char t = stack.peek();
        if (/* t and c match, such as 'A' and 'B' */) {
          stack.pop();
        }
        else {
          stack.push(c);
        }
      }
    }
    
    // Return a string based on what's left in the stack.