简单的方法:
构建输入字符串的正则表达式并将该正则表达式的所有出现替换为空。
正则表达式将采用以下形式:
(a|b|c)\\b
(a|b|c)匹配a,b或c.
\\b是单词边界,表示单词的结尾。
代码:
String[] arr = {"ical", "ic", "ion", "ogy"};
String input = "Hello world, this sentence is magic. Because we will talk about Biology.";
String regex = "(" + arr[0];
for (String s: arr)
regex += "|" + s; // using Pattern.quote(s) instead of s here would be safer
regex += ")\\b";
input = input.replaceAll(regex, "");
System.out.println(input);
印刷:
Hello world, this sentence is mag. Because we will talk about Biol.
更复杂的方法:
建立一个你的后缀的trie,但相反。
从后面处理字符串。
如果你得到一个单词的开头,则在 trie 中查找下一个字符,如果在 trie 中找到匹配项,则将它们切断。
最后使用StringBuilderandStringBuilder.reverse()可以有效地执行此操作。
例子:
鉴于:
ical, ic, ion, ogy
您的尝试将如下所示:
.
/|\
y // \\ l
/n| |c\
. . . .
g| o| |i |a
. . X .
o| i| |c
X X .
|i
X
(X是终止节点(后缀的结尾),.是非终止节点)
输入:
John Biology.
逆向处理...
过程:"."
不是一句话,只是添加到输出中。
输出 ="."
过程:"Biology"
根有一个y孩子,所以我们移动到那个节点。
该节点有一个g孩子,所以我们继续。
该节点有一个o孩子,所以我们继续。然后我们到达了一个终止节点,所以丢弃处理过的字符并打印单词的其余部分。
输出:".loiB"
过程:" "
不是一句话,只是添加到输出中。
输出 =".loiB "
过程:"John"
根有一个n孩子,所以我们移动到那个节点。
该节点没有h子节点,因此我们停止并输出处理后的字符以及单词的其余部分(即输出整个单词)。
输出 =".loiB nhoJ"
反向,给我们:"John Biol."