例如,如果输入为“name”且minGram为1且maxGramSize为2,则输出将由n,a,m,e,na,am,me组成。如果minGram = 2,则maxGram = 4 inputWord = name,output = na,am,me,nam,ame,name。
函数签名可以是这样的:
public List<String> generateNGrams(String input, int minGramSize, int maxGramSize)
最初我尝试使用for循环,但我发现很难遵循索引。然后我尝试使用笔和纸的递归解决它,但我仍在努力解决它。有人可以帮我弄这个吗?
答案 0 :(得分:2)
一个解决方案:
private static void addNgrams(final int size, final String input,
final List<String> list)
{
final int maxStartIndex = input.length() - size;
for (int i = 0; i < maxStartIndex; i++)
list.add(input.stubString(i, i + size));
}
public List<String> generateNGrams(final String input, final int minSize,
final int maxSize)
{
final List<String> ret = new ArrayList<>();
for (int size = minSize; size <= maxSize; size++)
addNgrams(size, input, ret);
return ret;
}
注意:缺少基本错误检查(例如,maxSize
大于input
; minSize
大于maxSize
;其他);留下来作为练习。
答案 1 :(得分:2)
这是一个递归生成nGrams的程序:这段代码也处理尾部。
import java.util.ArrayList;
public class NGrams {
ArrayList<String> nGrams = new ArrayList<String>();
public void generateNGrams(String str, int n) {
if (str.length() == n ) {
int counter = 0;
while (counter < n) {
nGrams.add(str.substring(counter));
counter++;
}
return;
}
int counter = 0;
String gram = "";
while (counter < n) {
gram += str.charAt(counter);
counter++;
}
nGrams.add(gram);
generateNGrams(str.substring(1), n);
}
public void printNGrams() {
for (String str : nGrams) {
System.out.println(str);
}
}
public static void main(String[] args) {
NGrams ng = new NGrams();
ng.generateNGrams("hello world", 3);
ng.printNGrams();
}
}
输出:
hel
ell
llo
lo
o w
wo
wor
orl
rld
ld
d