如何在Java中生成一个单词的所有可能的快捷方式?

How to generate all possible shortcuts of a word in Java?

是否有一种算法可以生成一个单词的所有可能的快捷方式? 例如:

输入:Arteria

输出:

Arter.
Art.
Ar.
Aa.
aa.
a.

对于高级示例:

输入:Contrast Agents

输出:

C.A.
ca.
contr.a.
contr.ag.

编辑 基于负面反应,因为没有深入指定规则。

简单缩写词生成规则:

  1. 缩略词应以辅音结尾
  2. 缩略词应根据单词的音节创建。我们可以把音节分为:

    -单音节词称为单音节词: 猫,狗,车,天空。

    -双音节词称为双音节词: Ho-tel, Po-em, Chor-us.

    -三音节词称为三音节词: Beau-ti-ful, met-a-phor, po-e-try.

    -三个音节以上的词称为多音节词: Ox-y-mor-on.

所以它应该同时应用这两个规则。谢谢!

高级规则是针对拉丁语的,我会post另一个关于 em 的问题。

谢谢!

您的起点可能是获取单词/单个字符的所有可能组合。

从那时起,您可以尝试构建一个更具体的算法来考虑您的特定需求。

作为组合单词的非常基本的实现,您可以尝试以下方法:

import java.util.ArrayList;
import java.util.List;

public class Shortcut {

    public Shortcut() {
        printMultipleWordShortcuts("Contrast Agents");
    }

    private String[] getSingleWordShortcuts(String input) {

        String[] possibleCombinations = new String[ input.length() ];

        // Iterate backwards over the input string and get possible
        // combinations
        for(int i = input.length(); i > 0; i--) {

            possibleCombinations[i-1] = input.substring(0, i);

        }

        return possibleCombinations;

    }

    private void printMultipleWordShortcuts(String input) {

        // Split the input string, assuming that the input words are separated by spaces
        String[] splitWords = input.split(" ");

        List<String[]> allCombinations = new ArrayList<>();

        List<String> result = new ArrayList<>();

        // Get possible combinations for every split word.
        for(int i = 0; i < splitWords.length; i++) {
            allCombinations.add(getSingleWordShortcuts(splitWords[i]));
        }

        for(int i = 0; i < allCombinations.size(); i++) {

            for(int j = allCombinations.get(i).length; j > 0; j--) {

                if(i + 1 < allCombinations.size()) {

                    for(int c = 0; c<allCombinations.get(i+1).length; c++) {

                        result.add(allCombinations.get(i)[j-1] + ". " + allCombinations.get(i+1)[c] + ".");
                    }
                }
            }
        }

        // Output all possibilities
        for(String s : result) {
            System.out.println(s);
        }
    }
}

以上代码的输出为

Contrast. A.
Contrast. Ag.
Contrast. Age.
Contrast. Agen.
Contrast. Agent.
Contrast. Agents.
Contras. A.
Contras. Ag.
Contras. Age.
Contras. Agen.
Contras. Agent.
Contras. Agents.
Contra. A.
Contra. Ag.
Contra. Age.
Contra. Agen.
Contra. Agent.
Contra. Agents.
Contr. A.
Contr. Ag.
Contr. Age.
Contr. Agen.
Contr. Agent.
Contr. Agents.
Cont. A.
Cont. Ag.
Cont. Age.
Cont. Agen.
Cont. Agent.
Cont. Agents.
Con. A.
Con. Ag.
Con. Age.
Con. Agen.
Con. Agent.
Con. Agents.
Co. A.
Co. Ag.
Co. Age.
Co. Agen.
Co. Agent.
Co. Agents.
C. A.
C. Ag.
C. Age.
C. Agen.
C. Agent.
C. Agents.