【问题标题】:Efficient way to check if an input string contains any punctuation from a string of punctuations检查输入字符串是否包含标点符号字符串中的任何标点符号的有效方法
【发布时间】:2018-08-06 22:10:50
【问题描述】:

我正在研究一种逻辑来检测输入字符串是否包含来自标点符号字符串的任何标点符号。

public boolean detectAnyPunctuation(String input, String punctuationArray){}

如果在输入字符串中找到标点数组中的任何标点,该函数应返回 true。标点数组不固定。它可以随着每个函数调用而改变。输入字符串不能超过 1000 个字符。

我正在考虑将标点符号数组转换为 char 数组,然后在 char 数组上运行循环以检查输入字符串中的字符。 时间复杂度为 O(MN),其中 m 是标点数组中的字符,N 是输入数组中的字符(最坏情况)。

最后我使用正则表达式实现如下,

public static boolean detectPunctuations(String in, String pu){ 
String puQ = “[” + pu + “]”; 
Pattern pattern = Pattern.compile(puQ); 
Matcher m = pattern.matcher(in); 
return m.find(); 
}

编辑: 现在我正在尝试查找它是否包含标点字符串中的所有标点符号。仅当标点字符串中的所有标点都出现在输入字符串中时,它才应返回 true。请问这个有什么意见吗?

【问题讨论】:

  • 如果您希望最小化它的渐近复杂性,那么哈希表将使其成为 O(N)。不过,对于小 M,O(MN) 完全有可能在实践中更快。
  • 如果我使用标点数组编译一个模式,然后用它来匹配输入字符串呢?
  • Punctuation Array is not fixed. It could be changed with each function call. 你能详细说明一下吗?顺便说一句,没有像“包含”这样的字符串方法可以做到这一点吗?
  • 在正则表达式中,字符类元素是从左到右搜索的。因此,如果您将最常见的标点符号放在全班最后,则需要更长的时间才能找到。仅供参考。
  • 如果@sln 关于 JDK 的内部正则表达式实现是正确的,那么正则表达式方法也是 O(MN)。

标签: java regex pattern-matching punctuation


【解决方案1】:

这是 O(n + k):

public boolean detectAnyPunctuation(String input, String punctuationArray) {
    Set<Integer> set = punctuationArray
      .chars().boxed()
      .collect(Collectors.toSet());
    return input.chars().boxed()
      .filter(set::contains)
      .distinct().count() == set.size();
}

所有操作都是常数时间。总操作是punctuationsinput的长度之和。

【讨论】:

    【解决方案2】:

    当然:

    boolean hit = str.matches(".*[" + punctuation + "].*");
    

    在字符类中使用时没有需要转义的标点字符。

    我想你会发现性能相当不错。如果标点字符串是常量,则构建一次正则表达式模式并重用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      相关资源
      最近更新 更多