【问题标题】:How to get number of all unique permutations of lengh k out of string of length n?如何从长度为 n 的字符串中获取长度为 k 的所有唯一排列的数量?
【发布时间】:2023-04-10 04:02:01
【问题描述】:

假设给定字符串s = "aba"k = 2。那么我们可以使用字符串字符进行的排列是

aa ab ba

所以答案是 3。

如果s = "aabb"k = 2 则可能的排列是

aa ab ba bb 

所以答案是 4。

我们只能使用一个字符在字符串中出现的次数或少于该字符的次数,但不能多于该字符。

有什么公式或者方法可以快速找出来吗?

注意:K 不是唯一字符的数量,例如。 s = "aabbcdd" k 的值可能是k = 3

【问题讨论】:

  • 这似乎更适合Mathematics Stack Exchange。请查看他们的help pages 了解更多信息。
  • 这些东西对你有什么意义C(n,k) = n! /k!(n-k)!A(n,k) = n!/(n-k)!
  • 查看如果 s= "aabb" 和 k=2 那么可能的排列是 "aa" "ab" "ba" 和 "bb"。所以答案是 4。
  • 答案是肯定的。这些被称为多重集的排列,并且有一些关于这个主题的写得很好的文章(包括计数算法)。我最喜欢的是 Frank Ruskey 的 Combinatorial Generation。
  • @TraianGEICU ,这个问题的答案并不像你建议的那么简单。例如,尝试找出长度为 6 的“aaaaabbbbcccdde”的唯一排列数。

标签: java c++ algorithm permutation


【解决方案1】:
import java.util.*;

class solution {
 static int findPermutation(String str, int k) {
  boolean[] has = new boolean[26];
  Arrays.fill(has, false);
  int cnt = 0;

  for (int i = 0; i < str.length(); i++) {
   if (!has[str.charAt(i) - 'a']) {

    cnt++;

    has[str.charAt(i) - 'a'] = true;
   }
  }

  int ans = 1;

  for (int i = 2; i <= cnt; i++)
   ans *= i;

  for (int i = cnt - k; i > 1; i--)
   ans /= i;
  return ans;
 }

 // Driver code 
 public static void main(String args[]) {
  String str = "rrpk";
  int k = 2;
  System.out.println(findPermutation(str, k));

 }
}

算法: 首先计算字符串中的 uniqe 字符,然后从 uniqe 字符列表中取出 k 个字符并排列它们,即 nPr = n! / (n – r)!。

【讨论】:

  • K 不是唯一字符的数量,例如。 s=aabbcdd k 的值可能是 k=3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2018-10-14
  • 2021-09-27
相关资源
最近更新 更多