【问题标题】:Looking for a better performant String replace solution in Java在 Java 中寻找性能更好的字符串替换解决方案
【发布时间】:2021-08-26 21:27:21
【问题描述】:

给定一个只能有字母的字符串输入。如果存在 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;
    }

【问题讨论】:

  • 问题可能比你想象的要难。例如,考虑要删除的字符串是 AB 和 BC,输入是 ABCB。您的代码将删除 AB 离开 CB。另一种答案是先删除 BC,留下 AB,然后删除 AB,留下一个空字符串。

标签: java string algorithm data-structures replace


【解决方案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。

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

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多