【问题标题】:time complexity of regular expression in javajava中正则表达式的时间复杂度
【发布时间】:2016-11-30 19:19:44
【问题描述】:

我写了如下一个java,通过使用正则表达式在Strings中查找重复的String。现在我试着找出它的复杂性,如果有人知道它的复杂性,请告诉我。

           String s = "ABCABCAAAABBBBCCAAABCGABCABC";

           Pattern pattern = Pattern.compile("(?:([ABC])(?!\\1)([ABC])\\1\\2)+");
           Matcher matcher = pattern.matcher(s);

           while (matcher.find()) {
              System.out.print("FOUND");
           }

【问题讨论】:

  • 我不知道为什么这被标记为“征求建议”,但似乎 OP 并没有为解决问题做太多工作。
  • 你需要了解 matcher.find() 是如何工作的。它如何搜索字符串以及何时停止。
  • 我大胆猜测一下,说它等于 matcher.find() 的复杂度
  • 你在那里的表达式看起来像它试图匹配一个序列中最多 5 个字符,+ 在那上面,意思是一个或多个。这可能会搜索整个字符串。但是它只需要一个匹配,所以第一个匹配就足够了。所以我认为它只会扫描字符串一次或两次,这取决于,所以时间复杂度大致等于目标字符串s中的字符数。

标签: java regex time time-complexity big-o


【解决方案1】:

正则表达式可以/由有限状态机实现。所以状态机具有一些固定数量的状态和这些状态之间的固定最大转换次数 (T)。

对每个字符进行一次转换,直到它被拒绝或接受。

所以你有 O( String.length() * T) 或 O( String.length() ) 因为 T 是一个常数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2019-04-30
    • 2019-07-08
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多