通过众所周知的Steinhaus-Johnson-Trotter算法查找字符串的所有排列。但是,如果字符串包含重复的字符,例如
AABB,
那么可能的唯一组合将是4!/(2!* 2!)= 6

实现此目的的一种方法是,我们可以将其存储在大约一个数组中,然后删除重复项。

有没有更简单的方法来修改Johnson算法,这样我们就永远不会生成重复的排列。 (以最有效的方式)

最佳答案

使用以下递归算法:

PermutList Permute(SymArray fullSymArray){
    PermutList resultList=empty;
    for( each symbol A in fullSymArray, but repeated ones take only once) {
       PermutList lesserPermutList=  Permute(fullSymArray without A)
       for ( each SymArray item in lesserPermutList){
            resultList.add("A"+item);
       }
    }
    return resultList;
}

如您所见,这非常容易

10-07 21:50