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

时间:2021-06-09 20:49:39

标签: java string algorithm data-structures replace

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

  1. 输入:ABDCC -> 输出:C
  2. 输入:CABABD -> CABD -> CD -> 输出:空字符串 我想出了一个使用字符串替换功能的以下解决方案,但正在寻找性能更高或替代的解决方案。有什么想法吗?
public String transformString(String s) {
        HashSet<String> stringsToRemove = new HashSet();
        stringsToRemove.add("AB");
        stringsToRemove.add("BA");
        stringsToRemove.add("CD");
        stringsToRemove.add("DC");
        
        int prevLength = -1;
        while (prevLength != s.length()) {
            prevLength = s.length();
            for (String d : stringsToRemove) {
               s = s.replace(d, "");
            }
        }
        return s;
    }

1 个答案:

答案 0 :(得分:1)

从括号匹配中获取策略并使用堆栈。帮助您入门的解决方案草图:

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.

显然,这仅在“匹配”没有边缘情况时才有效,例如 user3386109 在他们的评论中提到的情况。

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