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

时间:2016-01-30 09:54:39

标签: java string algorithm shortcut

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

输入:Arteria

输出:

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

对于高级示例:

输入:Contrast Agents

输出:

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

编辑基于负面反应,因为没有明确规定。

简单缩写词生成的规则:

  1. 这些缩写最终应该是辅音
  2. 应该从单词的音节创建accronyms。我们可以将音节划分为:

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

    - 两个音节词称为双音节词: Ho-tel,Po-em,Chor-us。

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

    - 超过三个音节词称为多音节: 牛-Y-MOR-上。

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

    高级规则适用于拉丁语,我将为他们发布另一个问题。

    Thnanks!

1 个答案:

答案 0 :(得分:2)

一个起点可能是,获得所有可能的单词/单个字符组合。

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

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

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.