📌  相关文章
📜  字符串的排列数,其中一个给定字符出现都一起出现

📅  最后修改于: 2021-04-27 16:52:58             🧑  作者: Mango

给定字符串“ s”和字符“ c”,任务是查找字符串的排列数,其中所有出现的字符“ c”将在一起(一个接一个)。

例子 :

天真的方法:

  • 生成给定字符串的所有排列。
  • 对于每个排列,检查是否所有出现的字符都一起出现。
  • 上一步的排列数就是答案。

高效方法:将字符串的长度设为“ l”,并将字符串字符的频率设为“ n”。

  • 存储字符串中每个字符的频率。
  • 如果字符中不存在该字符串,则输出将为“ 0”。
  • 将所有出现的字符视为一个组合的单个字符。
  • 因此,“ l”将变为“ l – occ + 1”,其中“ occ”是给定字符的总出现次数,“ l”是字符串的新长度。
  • 返回((l的因子)/(给定字符以外的每个字符的出现次数的阶乘积的乘积))

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return factorial
// of the number passed as argument
long long int fact(int n)
{
    long long result = 1;
    for (int i = 1; i <= n; i++)
        result *= i;
    return result;
}
  
// Function to get the total permutations
// which satisfy the given condition
int getResult(string str, char ch)
{
    // Create has to store count
    // of each character
    int has[26] = { 0 };
  
    // Store character occurrences
    for (int i = 0; i < str.length(); i++)
        has[str[i] - 'A']++;
  
    // Count number of times
    // Particular character comes
    int particular = has[ch - 'A'];
  
    // If particular character isn't
    // present in the string then return 0
    if (particular == 0)
        return 0;
  
    // Remove count of particular character
    has[ch - 'A'] = 0;
  
    // Total length
    // of the string
    int total = str.length();
  
    // Assume all occurrences of
    // particular character as a
    // single character.
    total = total - particular + 1;
  
    // Compute factorial of the length
    long long int result = fact(total);
  
    // Divide by the factorials of
    // the no. of occurrences of all
    // the characters.
    for (int i = 0; i < 26; i++) {
        if (has[i] > 1) {
            result = result / fact(has[i]);
        }
    }
  
    // return the result
    return result;
}
  
// Driver Code
int main()
{
    string str = "MISSISSIPPI";
  
    // Assuming the string and the character
    // are all in uppercase
    cout << getResult(str, 'S') << endl;
  
  return 0;
}


Java
// Java implementation of above approach
import java.util.*;
class solution
{
  
// Function to return factorial
// of the number passed as argument
 static int fact(int n)
{
     int result = 1;
    for (int i = 1; i <= n; i++)
        result *= i;
    return result;
}
  
// Function to get the total permutations
// which satisfy the given condition
static int getResult(String str, char ch)
{
    // Create has to store count
    // of each character
    int has[] = new int[26];
      
    for(int i=0;i<26;i++)
    has[i]=0;
  
    // Store character occurrences
    for (int i = 0; i < str.length(); i++)
        has[str.charAt(i) - 'A']++;
  
    // Count number of times
    // Particular character comes
    int particular = has[ch - 'A'];
  
    // If particular character isn't
    // present in the string then return 0
    if (particular == 0)
        return 0;
  
    // Remove count of particular character
    has[ch - 'A'] = 0;
  
    // Total length
    // of the string
    int total = str.length();
  
    // Assume all occurrences of
    // particular character as a
    // single character.
    total = total - particular + 1;
  
    // Compute factorial of the length
     int result = fact(total);
  
    // Divide by the factorials of
    // the no. of occurrences of all
    // the characters.
    for (int i = 0; i < 26; i++) {
        if (has[i] > 1) {
            result = result / fact(has[i]);
        }
    }
  
    // return the result
    return result;
}
  
// Driver Code
public static void main(String args[])
{
    String str = "MISSISSIPPI";
  
    // Assuming the string and the character
    // are all in uppercase
    System.out.println( getResult(str, 'S') );
  
}
}
//contributed by Arnab Kundu


Python 3
# Python3 implementation of 
# the approach 
  
# Function to return factorial 
# of the number passed as argument 
def fact(n) :
  
    result = 1
  
    for i in range(1, n + 1) :
        result *= i
  
    return result
  
# Function to get the total permutations 
# which satisfy the given condition 
def getResult(string, ch):
  
    # Create has to store count 
    # of each character
    has = [0] * 26
  
    # Store character occurrences 
    for i in range(len(string)) :
        has[ord(string[i]) - ord('A')] += 1
  
    # Count number of times 
    # Particular character comes 
    particular = has[ord(ch) - ord('A')]
  
    # If particular character isn't 
    # present in the string then return 0
    if particular == 0 :
        return 0
  
    # Remove count of particular character 
    has[ord(ch) - ord('A')] = 0
  
    # Total length 
    # of the string 
    total = len(string)
  
    # Assume all occurrences of 
    # particular character as a 
    # single character. 
    total = total - particular + 1
  
    # Compute factorial of the length 
    result = fact(total)
  
    # Divide by the factorials of 
    # the no. of occurrences of all 
    # the characters. 
    for i in range(26) :
  
        if has[i] > 1 :
            result /= fact(has[i])
  
    # return the result 
    return result
  
  
# Driver code
if __name__ == "__main__" :
  
    string = "MISSISSIPPI"
  
    # Assuming the string and the character 
    # are all in uppercase 
    print(getResult(string,'S'))
  
# This code is contributed 
# by ANKITRAI1


C#
// C# implementation of above approach
using System;
  
class GFG
{
  
// Function to return factorial
// of the number passed as argument
static int fact(int n)
{
    int result = 1;
    for (int i = 1; i <= n; i++)
        result *= i;
    return result;
}
  
// Function to get the total permutations
// which satisfy the given condition
static int getResult(string str, char ch)
{
    // Create has to store count
    // of each character
    int []has = new int[26];
      
    for(int i = 0; i < 26; i++)
    has[i] = 0;
  
    // Store character occurrences
    for (int i = 0; i < str.Length; i++)
        has[str[i] - 'A']++;
  
    // Count number of times
    // Particular character comes
    int particular = has[ch - 'A'];
  
    // If particular character 
    // isn't present in the string 
    // then return 0
    if (particular == 0)
        return 0;
  
    // Remove count of particular character
    has[ch - 'A'] = 0;
  
    // Total length of the string
    int total = str.Length;
  
    // Assume all occurrences of
    // particular character as a
    // single character.
    total = total - particular + 1;
  
    // Compute factorial of the length
    int result = fact(total);
  
    // Divide by the factorials of
    // the no. of occurrences of all
    // the characters.
    for (int i = 0; i < 26; i++) 
    {
        if (has[i] > 1) 
        {
            result = result / fact(has[i]);
        }
    }
  
    // return the result
    return result;
}
  
// Driver Code
public static void Main()
{
    string str = "MISSISSIPPI";
  
    // Assuming the string and the 
    // character are all in uppercase
    Console.WriteLine(getResult(str, 'S') );
}
}
  
// This code is contributed by anuj_67


PHP
 1)
        {
            $result = $result / fact($has[$i]);
        }
    }
  
    // return the result
    return $result;
}
  
// Driver Code
$str = "MISSISSIPPI";
  
// Assuming the string and the character
// are all in uppercase
echo getResult($str, 'S')."\n" ;
  
// This code is contributed by ita_c
?>


输出:
840