我正在研究一种逻辑,以检测输入字符串是否包含标点字符串中的任何标点。
public boolean detectAnyPunctuation(String input, String punctuationArray){}
在输入字符串中找到的标点数组中的任何标点,该函数均应返回true。标点数组不固定。每个函数调用都可以更改它。输入的字符串不能超过1000个字符。
我正在考虑将标点符号数组转换为char数组,然后在char数组上运行循环以检查输入字符串中的字符。 为此的时间复杂度为O(MN),其中m是标点数组中的字符,而N是输入数组中的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。请为此输入任何信息吗?
答案 0 :(得分: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();
}
所有操作都是固定时间。总操作数是punctuations
和input
的长度之和。
答案 1 :(得分:0)
确定:
boolean hit = str.matches(".*[" + punctuation + "].*");
在字符类中使用时,没有标点符号需要转义。
我认为您会发现性能相当不错。如果标点字符串是常量,则只需构建一次正则表达式模式,然后再使用它即可。