给定一个大小为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.
方法:这个想法是使用频率计数。
- 创建一个 Hashing 数据结构,用于存储字符’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
Javascript
6
时间复杂度: O(N)
辅助空间复杂度: O(26) 相当于 O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。