我正在研究一个逻辑来检测输入字符串是否包含标点符号字符串中的任何标点符号。
public boolean detectAnyPunctuation(String input, String punctuationArray){}
该函数应返回输入字符串中标点符号数组中的任何标点符号的 true。标点符号数组不固定。每次函数调用都可以更改它。输入字符串不能超过 1000 个字符。
我正在考虑将标点符号数组转换为字符数组,然后在字符数组上运行循环以检查输入字符串中的字符。 其时间复杂度为 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。请问这个有什么输入吗?
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
长度的总和。
当然:
boolean hit = str.matches(".*[" + punctuation + "].*");
在字符类中使用时,没有需要转义的标点字符。我想你会发现性能相当不错。如果标点符号字符串是常量,则构建一次正则表达式模式并重用它。