如何从长度为n的字符串中得出长度为k的所有唯一排列的数量?

时间:2019-01-26 04:41:43

标签: java c++ algorithm permutation

假设给定字符串$secret = 'SECRET_KEY'; $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['recaptcha']); $responseData = json_decode($verifyResponse); if($responseData->success){ //valid response, move forward }else{ //captcha check failed, throw an error } s = "aba"。那么我们可以使用字符串字符进行的排列是

k = 2

答案是3。

如果aa ab ba s = "aabb",则可能的排列是

k = 2

所以答案是4。

我们只能使用字符出现在字符串中的次数不超过此次数,但不能超过该次数。

有没有公式或某种方法可以快速找到它?

注意:K不是唯一字符的数量,例如。 aa ab ba bb 的k值可以是s = "aabbcdd"

1 个答案:

答案 0 :(得分:0)

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)!。