如何在Java中找到N克的单词?

时间:2014-03-16 18:51:33

标签: java string algorithm loops recursion

例如,如果输入为“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循环,但我发现很难遵循索引。然后我尝试使用笔和纸的递归解决它,但我仍在努力解决它。有人可以帮我弄这个吗?

2 个答案:

答案 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