Finding the ranking of a word (permutations) with duplicate letters

前端 未结 6 635
有刺的猬
有刺的猬 2020-11-27 07:09

I\'m posting this although much has already been posted about this question. I didn\'t want to post as an answer since it\'s not working. The answer to this post (Finding th

6条回答
  •  臣服心动
    2020-11-27 07:41

    Java version of unrank for a String:

    public static String unrankperm(String letters, int rank) {
        Map charCounts = new java.util.HashMap<>();
        int permcount = 1;
        for(int i = 0; i < letters.length(); i++) {
            char x = letters.charAt(i);
            int xCount = charCounts.containsKey(x) ? charCounts.get(x) + 1 : 1;
            charCounts.put(x, xCount);
    
            permcount = (permcount * (i + 1)) / xCount;
        }
        // charCounts is the histogram of letters
        // permcount is the number of distinct perms of letters
        StringBuilder perm = new StringBuilder();
    
        for(int i = 0; i < letters.length(); i++) {
            List sorted = new ArrayList<>(charCounts.keySet());
            Collections.sort(sorted);
    
            for(Character x : sorted) {
                // suffixcount is the number of distinct perms that begin with x
                Integer frequency = charCounts.get(x);
                int suffixcount = permcount * frequency / (letters.length() - i); 
    
                if (rank <= suffixcount) {
                    perm.append(x);
    
                    permcount = suffixcount;
    
                    if(frequency == 1) {
                        charCounts.remove(x);
                    } else {
                        charCounts.put(x, frequency - 1);
                    }
                    break;
                }
                rank -= suffixcount;
            }
        }
        return perm.toString();
    }
    

    See also n-th-permutation-algorithm-for-use-in-brute-force-bin-packaging-parallelization.

提交回复
热议问题