给定一个大小为N的低位字母字符串“ S”和一个整数K ;任务是找到仍将取消组合,划分给定的字符串成明显不同的字符K组后的字符个数。
例子:
Input: S = “stayinghomesaveslife”, K = 1
Output: 6
Explanation:
In the string S the elements whose occurence is more than one time are ‘e’ -> 3 times, ‘s’ -> 3 times, ‘a’ -> 2 times, ‘i’ -> 2 times and rest all elements occurs 1 time each.
There is only one group to be formed as K = 1 so only one copy of these elements can be present in the group and rest all elements cannot be in the group,
So the elements which are left out of the group are 2-times ‘e’, 2-times ‘s’, 1-time ‘a’ and 1-time ‘i’.
Total elements left out are 6.
Input: S = “stayinghomesaveslife”, K = 2
Output: 2
Explanation:
In the string S the elements whose occurence is more than one time are ‘e’ -> 3 times, ‘s’ -> 3 times, ‘a’ -> 2 times, ‘i’ -> 2 times and rest all elements occurs 1 time each.
Since 2 groups can be formed, one group contains 1 copy of all the elements. The second group will contain 1 copy of the extra elements i.e. ‘e’, ‘s’, ‘a’ and ‘i’. The elements that will be left out are 1-time ‘e’ and 1-time ‘s’.
Total elements that will be left out are 2.
方法:想法是使用频率计数。
- 创建一个哈希数据结构,以存储字符“ a”-“ z”的频率。
- 在给定的字符串找到每个字符的初始频率,并将其存储在哈希数据结构中。
- 由于一个组只能包含1个字符。因此,从散列数据结构中每个字符的出现减少K。
- 现在,在哈希数据结构中添加字符的其余频率。这将是保持未分组的所需字符数。
下面是上述方法的实现:
C++
// C++ code to implement the above approach
#include
using namespace std;
void findUngroupedElement(string s,
int k)
{
int n = s.length();
// create array where
// index represents alphabets
int b[26];
for (int i = 0; i < 26; i++)
b[i] = 0;
// fill count of every
// alphabet to corresponding
// array index
for (int i = 0; i < n; i++) {
char p = s.at(i);
b[p - 'a'] += 1;
}
int sum = 0;
// count for every element
// how much is exceeding
// from no. of groups then
// sum them
for (int i = 0; i < 26; i++) {
if (b[i] > k)
sum += b[i] - k;
}
// print answer
cout << sum << endl;
}
// Driver code
int main()
{
string s = "stayinghomesaveslife";
int k = 1;
findUngroupedElement(s, k);
return 0;
}
Java
// Java code to implement the above approach
import java.util.*;
class GFG{
static void findUngroupedElement(String s,
int k)
{
int n = s.length();
// Create array where
// index represents alphabets
int []b = new int[26];
for(int i = 0; i < 26; i++)
b[i] = 0;
// Fill count of every
// alphabet to corresponding
// array index
for(int i = 0; i < n; i++)
{
char p = s.charAt(i);
b[p - 'a'] += 1;
}
int sum = 0;
// Count for every element
// how much is exceeding
// from no. of groups then
// sum them
for(int i = 0; i < 26; i++)
{
if (b[i] > k)
sum += b[i] - k;
}
// Print answer
System.out.println(sum);
}
// Driver code
public static void main(String srgs[])
{
String s = "stayinghomesaveslife";
int k = 1;
findUngroupedElement(s, k);
}
}
// This code is contributed by ANKITKUMAR34
Python3
# Python3 code to implement the above approach
def findUngroupedElement(s, k):
n = len(s);
# Create array where
# index represents alphabets
b = [0] * 26
# Fill count of every
# alphabet to corresponding
# array index
for i in range(n):
p = s[i]
b[ord(p) - ord('a')] += 1
sum = 0;
# Count for every element
# how much is exceeding
# from no. of groups then
# sum them
for i in range(26):
if (b[i] > k):
sum += b[i] - k
# Print answer
print(sum)
# Driver code
s = "stayinghomesaveslife"
k = 1
findUngroupedElement(s, k)
# This code is contributed by ANKITKUMAR34
C#
// C# code to implement the above approach
using System;
class GFG{
static void findUngroupedElement(String s,
int k)
{
int n = s.Length;
// Create array where
// index represents alphabets
int []b = new int[26];
for(int i = 0; i < 26; i++)
b[i] = 0;
// Fill count of every
// alphabet to corresponding
// array index
for(int i = 0; i < n; i++)
{
char p = s[i];
b[p - 'a'] += 1;
}
int sum = 0;
// Count for every element
// how much is exceeding
// from no. of groups then
// sum them
for(int i = 0; i < 26; i++)
{
if (b[i] > k)
sum += b[i] - k;
}
// Print answer
Console.WriteLine(sum);
}
// Driver code
public static void Main(String []srgs)
{
String s = "stayinghomesaveslife";
int k = 1;
findUngroupedElement(s, k);
}
}
// This code is contributed by Rajput-Ji
6
时间复杂度: O(N)
辅助空间复杂度: O(26)等效于O(1)