Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字谜算法澄清_Java_Algorithm_Anagram - Fatal编程技术网

Java 字谜算法澄清

Java 字谜算法澄清,java,algorithm,anagram,Java,Algorithm,Anagram,我是这个论坛的新手,想问一个问题。我见过很多人问关于字谜的问题,但我的问题与这个特定的算法有关。我看到了这个算法,它使用递归技术生成字谜,但该算法的一部分对我来说不是很清楚。我想就采取这一具体步骤的原因寻求帮助。本算法大纲是从编程访谈中暴露出来的。以下是算法: 如果您超过了最后一个职位 打印字符串并返回 否则 对于输入字符串中的每个字母 如果标记为已使用,请跳到下一个字母 否则将字母置于当前位置 -标记使用的字母 -排列从当前位置开始的剩余字母+1 -将字母标记为未使用 以下是相同的代码: vo

我是这个论坛的新手,想问一个问题。我见过很多人问关于字谜的问题,但我的问题与这个特定的算法有关。我看到了这个算法,它使用递归技术生成字谜,但该算法的一部分对我来说不是很清楚。我想就采取这一具体步骤的原因寻求帮助。本算法大纲是从编程访谈中暴露出来的。以下是算法:

如果您超过了最后一个职位
打印字符串并返回
否则
对于输入字符串中的每个字母
如果标记为已使用,请跳到下一个字母
否则将字母置于当前位置
-标记使用的字母
-排列从当前位置开始的剩余字母+1
-将字母标记为未使用

以下是相同的代码:

void permute(String str){
    int length = str.length();
    boolean[] used = new boolean[length];
    StringBuffer out = new StringBuffer();
    char[] in = str.toCharArray();
    doPermute(in, out, used, length, 0);
}
void doPermute(char[] in, StringBuffer out, boolean[] used, int length,
    int level){
    if (level == length){
        System.out.println(out.toString());
        return;
    }
    for (int i = 0; i<length; i++){
        if (used[i]) continue;
        out.append(in[i]);
        used[i] = true;
        doPermute(in, out, used, length, level + 1);
        used[i] = false;
        out.setLength(out.length() - 1); // why are we reducing the size of out??
    }
}
void排列(字符串str){
int length=str.length();
布尔值[]已使用=新布尔值[长度];
StringBuffer out=新的StringBuffer();
char[]in=str.toCharArray();
doPermute(输入、输出、使用、长度,0);
}
void doPermute(字符[]输入,字符串缓冲区输出,使用布尔[],整数长度,
整数级){
如果(级别==长度){
System.out.println(out.toString());
返回;
}

对于(int i=0;i算法执行以下操作:

  • 从所有字母的集合中,让我们选择起始字母
  • 如果我们已经把它们都设置好了,那么我们就打印一个可能的字谜
  • 否则,我们会将其标记为已使用,我们需要将剩余字母的排列添加到末尾
让我们举个例子:

我们收到以下信件:

e、 x,a,m,p,l,e

让我们选择第一个字母:

其一:

  • e
    example
    的可能排列之一
  • x
    eample
  • 等等
当我们选择所有皮革时,我们将打印创建的单词

你也可以把它看作一棵决策树, 首先选择n个字母中的一个,然后从剩余字母中选择一个,一旦选择了所有字母(你到了树的底部,得到了一个独特的字谜),因为在每个步骤中都有一个for循环(因此对于所有可能的决策,探索树的较低级别)您将获得每个组合并打印它


我真的希望这能有所帮助。

恢复
out.append(in[I]);
(它添加了一个字符)的效果,并在每次迭代
for
循环后将缓冲区恢复到相同的状态

for (int i = 0; i<length; i++){
    if (used[i]) continue;
    out.append(in[i]); // try adding the ith letter
    used[i] = true;    // and mark it as used
    doPermute(in, out, used, length, level + 1); // do all the permutations for the remaining letters
    used[i] = false;                 // undo what we did
    out.setLength(out.length() - 1); // at the start of the loop
}

for(int i=0;iWow,该算法比我以前看到的用于字谜检查的算法复杂得多。我习惯于看到“将两个单词拆分为字母并排序,如果结果匹配,则两个是字谜”。我认为这是字谜生成算法,而不是检查:)谢谢biziclop!假设我有字符串abc,我需要为它获取字谜。这里是递归调用-对于从a开始的字谜,我们得到3个递归调用:doPermute(in,out,3,1),doPermute(in,out,3,2),doPermute(in,out,3,3).当长度和级别变为它时,递归调用返回,现在每个字符都被标记为未使用,并且该字符的输出缓冲区被清除,直到第一次递归调用,即do permute(in,out,3,1).然后我们将开始以b开头的字谜,并将使用已清除的相同缓冲区。这是正确的还是仍然缺少某些内容?