检查一个字符串是否包含所有频率相同的字符,只允许一个变化

给定一个小写字母字符串,通过删除1或0个字符来查找是否可以将其转换为有效字符串。“有效”字符串是字符串 str 这样,对于所有不同的字符 str 每个这样的字符在其中出现的次数相同。 例如:

null
Input : string str = "abbca"Output : YesWe can make it valid by removing "c"Input : string str = "aabbcd"Output : NoWe need to remove at least two charactersto make it valid.Input : string str = "abbccd"Output : No

我们只能穿越一次绳子。

其想法是使用存储所有字符频率的频率数组。一旦我们有了一个数组中所有字符的频率,我们就会检查所有不同和非零值的计数是否不超过2。此外,两个允许的不同频率的计数之一必须小于或等于2。下面是idea的实现。

C++

// C++ program to check if a string can be made
// valid by removing at most 1 character.
#include<bits/stdc++.h>
using namespace std;
// Assuming only lower case characters
const int CHARS = 26;
/* To check a string S can be converted to a “valid”
string by removing less than or equal to one
character. */
bool isValidString(string str)
{
int freq[CHARS] = {0};
// freq[] : stores the  frequency of each
// character of a string
for ( int i=0; i<str.length(); i++)
freq[str[i]- 'a' ]++;
// Find first character with non-zero frequency
int i, freq1 = 0, count_freq1 = 0;
for (i=0; i<CHARS; i++)
{
if (freq[i] != 0)
{
freq1  = freq[i];
count_freq1 = 1;
break ;
}
}
// Find a character with frequency different
// from freq1.
int j, freq2 = 0, count_freq2 = 0;
for (j=i+1; j<CHARS; j++)
{
if (freq[j] != 0)
{
if (freq[j] == freq1)
count_freq1++;
else
{
count_freq2 = 1;
freq2 = freq[j];
break ;
}
}
}
// If we find a third non-zero frequency
// or count of both frequencies become more
// than 1, then return false
for ( int k=j+1; k<CHARS; k++)
{
if (freq[k] != 0)
{
if (freq[k] == freq1)
count_freq1++;
if (freq[k] == freq2)
count_freq2++;
else // If we find a third non-zero freq
return false ;
}
// If counts of both frequencies is more than 1
if (count_freq1 > 1 && count_freq2 > 1)
return false ;
}
// Return true if we reach here
return true ;
}
// Driver code
int main()
{
char str[] = "abcbc" ;
if (isValidString(str))
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}


JAVA

// Java program to check if a string can be made
// valid by removing at most 1 character.
public class GFG {
// Assuming only lower case characters
static int CHARS = 26 ;
/* To check a string S can be converted to a “valid”
string by removing less than or equal to one
character. */
static boolean isValidString(String str) {
int freq[] = new int [CHARS];
// freq[] : stores the  frequency of each
// character of a string
for ( int i = 0 ; i < str.length(); i++) {
freq[str.charAt(i) - 'a' ]++;
}
// Find first character with non-zero frequency
int i, freq1 = 0 , count_freq1 = 0 ;
for (i = 0 ; i < CHARS; i++) {
if (freq[i] != 0 ) {
freq1 = freq[i];
count_freq1 = 1 ;
break ;
}
}
// Find a character with frequency different
// from freq1.
int j, freq2 = 0 , count_freq2 = 0 ;
for (j = i + 1 ; j < CHARS; j++) {
if (freq[j] != 0 ) {
if (freq[j] == freq1) {
count_freq1++;
} else {
count_freq2 = 1 ;
freq2 = freq[j];
break ;
}
}
}
// If we find a third non-zero frequency
// or count of both frequencies become more
// than 1, then return false
for ( int k = j + 1 ; k < CHARS; k++) {
if (freq[k] != 0 ) {
if (freq[k] == freq1) {
count_freq1++;
}
if (freq[k] == freq2) {
count_freq2++;
} else // If we find a third non-zero freq
{
return false ;
}
}
// If counts of both frequencies is more than 1
if (count_freq1 > 1 && count_freq2 > 1 ) {
return false ;
}
}
// Return true if we reach here
return true ;
}
// Driver code
public static void main(String[] args) {
String str = "abcbc" ;
if (isValidString(str)) {
System.out.println( "YES" );
} else {
System.out.println( "NO" );
}
}
}
// This code is contributed by PrinciRaj1992


Python3

# Python 3 program to check if
# a string can be made
# valid by removing at most 1 character.
# Assuming only lower case characters
CHARS = 26
# To check a string S can be converted to a “valid”
# string by removing less than or equal to one
# character.
def isValidString( str ):
freq = [ 0 ] * CHARS
# freq[] : stores the frequency of each
# character of a string
for i in range ( len ( str )):
freq[ ord ( str [i]) - ord ( 'a' )] + = 1
# Find first character with non-zero frequency
freq1 = 0
count_freq1 = 0
for i in range (CHARS):
if (freq[i] ! = 0 ):
freq1 = freq[i]
count_freq1 = 1
break
# Find a character with frequency different
# from freq1.
freq2 = 0
count_freq2 = 0
for j in range (i + 1 ,CHARS):
if (freq[j] ! = 0 ):
if (freq[j] = = freq1):
count_freq1 + = 1
else :
count_freq2 = 1
freq2 = freq[j]
break
# If we find a third non-zero frequency
# or count of both frequencies become more
# than 1, then return false
for k in range (j + 1 ,CHARS):
if (freq[k] ! = 0 ):
if (freq[k] = = freq1):
count_freq1 + = 1
if (freq[k] = = freq2):
count_freq2 + = 1
# If we find a third non-zero freq
else :
return False
# If counts of both frequencies is more than 1
if (count_freq1 > 1 and count_freq2 > 1 ):
return False
# Return true if we reach here
return True
# Driver code
if __name__ = = "__main__" :
str = "abcbc"
if (isValidString( str )):
print ( "YES" )
else :
print ( "NO" )
# this code is contributed by
# ChitraNayal


C#

// C# program to check if a string can be made
// valid by removing at most 1 character.
using System;
public class GFG {
// Assuming only lower case characters
static int CHARS = 26;
/* To check a string S can be converted to a “valid”
string by removing less than or equal to one
character. */
static bool isValidString(String str) {
int []freq = new int [CHARS];
int i=0;
// freq[] : stores the frequency of each
// character of a string
for ( i= 0; i < str.Length; i++) {
freq[str[i] - 'a' ]++;
}
// Find first character with non-zero frequency
int freq1 = 0, count_freq1 = 0;
for (i = 0; i < CHARS; i++) {
if (freq[i] != 0) {
freq1 = freq[i];
count_freq1 = 1;
break ;
}
}
// Find a character with frequency different
// from freq1.
int j, freq2 = 0, count_freq2 = 0;
for (j = i + 1; j < CHARS; j++) {
if (freq[j] != 0) {
if (freq[j] == freq1) {
count_freq1++;
} else {
count_freq2 = 1;
freq2 = freq[j];
break ;
}
}
}
// If we find a third non-zero frequency
// or count of both frequencies become more
// than 1, then return false
for ( int k = j + 1; k < CHARS; k++) {
if (freq[k] != 0) {
if (freq[k] == freq1) {
count_freq1++;
}
if (freq[k] == freq2) {
count_freq2++;
} else // If we find a third non-zero freq
{
return false ;
}
}
// If counts of both frequencies is more than 1
if (count_freq1 > 1 && count_freq2 > 1) {
return false ;
}
}
// Return true if we reach here
return true ;
}
// Driver code
public static void Main() {
String str = "abcbc" ;
if (isValidString(str)) {
Console.WriteLine( "YES" );
} else {
Console.WriteLine( "NO" );
}
}
}
// This code is contributed by 29AjayKumar


Javascript

<script>
// JavaScript program to check if a string can be made
// valid by removing at most 1 character.
// Assuming only lower case characters
let CHARS = 26;
/* To check a string S can be converted to a “valid”
string by removing less than or equal to one
character. */
function isValidString(str)
{
let freq = new Array(CHARS);
for (let i=0;i<CHARS;i++)
{
freq[i]=0;
}
// freq[] : stores the  frequency of each
// character of a string
for (let i = 0; i < str.length; i++) {
freq[str[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
}
// Find first character with non-zero frequency
let i, freq1 = 0, count_freq1 = 0;
for (i = 0; i < CHARS; i++) {
if (freq[i] != 0) {
freq1 = freq[i];
count_freq1 = 1;
break ;
}
}
// Find a character with frequency different
// from freq1.
let j, freq2 = 0, count_freq2 = 0;
for (j = i + 1; j < CHARS; j++) {
if (freq[j] != 0) {
if (freq[j] == freq1) {
count_freq1++;
} else {
count_freq2 = 1;
freq2 = freq[j];
break ;
}
}
}
// If we find a third non-zero frequency
// or count of both frequencies become more
// than 1, then return false
for (let k = j + 1; k < CHARS; k++) {
if (freq[k] != 0) {
if (freq[k] == freq1) {
count_freq1++;
}
if (freq[k] == freq2) {
count_freq2++;
} else // If we find a third non-zero freq
{
return false ;
}
}
// If counts of both frequencies is more than 1
if (count_freq1 > 1 && count_freq2 > 1) {
return false ;
}
}
// Return true if we reach here
return true ;
}
// Driver code
let str = "abcbc" ;
if (isValidString(str)) {
document.write( "YES" );
} else {
document.write( "NO" );
}
// This code is contributed by ab2127
</script>


输出:

YES

我们只穿过绳子一次。第一个循环之后的三个循环总共运行了6次。 另一种方法: (使用HashMap) 下面是实现。

C++

// C++ program to check if a string can be made
// valid by removing at most 1 character using hashmap.
#include <bits/stdc++.h>
using namespace std;
// To check a string S can be converted to a variation
// string
bool checkForVariation(string str)
{
if (str.empty() || str.length() != 0)
{
return true ;
}
map< char , int > mapp;
// Run loop form 0 to length of string
for ( int i = 0; i < str.length(); i++)
{
mapp[str[i]]++;
}
// declaration of variables
bool first = true , second = true ;
int val1 = 0, val2 = 0;
int countOfVal1 = 0, countOfVal2 = 0;
map< char , int >::iterator itr;
for (itr = mapp.begin(); itr != mapp.end(); ++itr)
{
int i = itr->first;
// if first is true than countOfVal1 increase
if (first)
{
val1 = i;
first = false ;
countOfVal1++;
continue ;
}
if (i == val1)
{
countOfVal1++;
continue ;
}
// if second is true than countOfVal2 increase
if (second)
{
val2 = i;
countOfVal2++;
second = false ;
continue ;
}
if (i == val2)
{
countOfVal2++;
continue ;
}
return false ;
}
if (countOfVal1 > 1 && countOfVal2 > 1)
{
return false ;
}
else
{
return true ;
}
}
// Driver code
int main() {
if (checkForVariation( "abcbcvf" ))
cout << "true" << endl;
else
cout << "false" << endl;
return 0;
}
// This code is contributed by avanitrachhadiya2155


JAVA

// Java program to check if a string can be made
// valid by removing at most 1 character using hashmap.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class AllCharsWithSameFrequencyWithOneVarAllowed {
// To check a string S can be converted to a variation
// string
public static boolean checkForVariation(String str) {
if (str == null || str.isEmpty()) {
return true ;
}
Map<Character, Integer> map = new HashMap<>();
// Run loop form 0 to length of string
for ( int i = 0 ; i < str.length(); i++) {
map.put(str.charAt(i), map.getOrDefault(str.charAt(i), 0 ) + 1 );
}
Iterator<Integer> itr = map.values().iterator();
// declaration of variables
boolean first = true , second = true ;
int val1 = 0 , val2 = 0 ;
int countOfVal1 = 0 , countOfVal2 = 0 ;
while (itr.hasNext()) {
int i = itr.next();
// if first is true than countOfVal1 increase
if (first) {
val1 = i;
first = false ;
countOfVal1++;
continue ;
}
if (i == val1) {
countOfVal1++;
continue ;
}
// if second is true than countOfVal2 increase
if (second) {
val2 = i;
countOfVal2++;
second = false ;
continue ;
}
if (i == val2) {
countOfVal2++;
continue ;
}
return false ;
}
if (countOfVal1 > 1 && countOfVal2 > 1 ) {
return false ;
} else {
return true ;
}
}
// Driver code
public static void main(String[] args)
{
System.out.println(checkForVariation( "abcbc" ));
}
}


Python3

# Python program to check if a string can be made
# valid by removing at most 1 character using hashmap.
# To check a string S can be converted to a variation
# string
def checkForVariation(strr):
if ( len (strr) = = 0 ):
return True
mapp = {}
# Run loop form 0 to length of string
for i in range ( len (strr)):
if strr[i] in mapp:
mapp[strr[i]] + = 1
else :
mapp[strr[i]] = 1
# declaration of variables
first = True
second = True
val1 = 0
val2 = 0
countOfVal1 = 0
countOfVal2 = 0
for itr in mapp:
i = itr
# if first is true than countOfVal1 increase
if (first):
val1 = i
first = False
countOfVal1 + = 1
continue
if (i = = val1):
countOfVal1 + = 1
continue
# if second is true than countOfVal2 increase
if (second):
val2 = i
countOfVal2 + = 1
second = False
continue
if (i = = val2):
countOfVal2 + = 1
continue
if (countOfVal1 > 1 and countOfVal2 > 1 ):
return False
else :
return True
# Driver code
print (checkForVariation( "abcbc" ))
# This code is contributed by rag2127


C#

// C# program to check if a string can be made
// valid by removing at most 1 character using hashmap.
using System;
using System.Collections.Generic;
public class AllCharsWithSameFrequencyWithOneVarAllowed
{
// To check a string S can be converted to a variation
// string
public static bool checkForVariation(String str)
{
if (str == null || str.Length != 0)
{
return true ;
}
Dictionary< char , int > map = new Dictionary< char , int >();
// Run loop form 0 to length of string
for ( int i = 0; i < str.Length; i++)
{
if (map.ContainsKey(str[i]))
map[str[i]] = map[str[i]]+1;
else
map.Add(str[i], 1);
}
// declaration of variables
bool first = true , second = true ;
int val1 = 0, val2 = 0;
int countOfVal1 = 0, countOfVal2 = 0;
foreach (KeyValuePair< char , int > itr in map)
{
int i = itr.Key;
// if first is true than countOfVal1 increase
if (first)
{
val1 = i;
first = false ;
countOfVal1++;
continue ;
}
if (i == val1)
{
countOfVal1++;
continue ;
}
// if second is true than countOfVal2 increase
if (second)
{
val2 = i;
countOfVal2++;
second = false ;
continue ;
}
if (i == val2)
{
countOfVal2++;
continue ;
}
return false ;
}
if (countOfVal1 > 1 && countOfVal2 > 1)
{
return false ;
}
else
{
return true ;
}
}
// Driver code
public static void Main(String[] args)
{
Console.WriteLine(checkForVariation( "abcbc" ));
}
}
// This code is contributed by 29AjayKumar


Javascript

<script>
// JavaScript program to check if a string can be made
// valid by removing at most 1 character using hashmap.
// To check a string S can be converted to a variation
// string
function checkForVariation(str)
{
if (str == null || str.length==0) {
return true ;
}
let map = new Map();
// Run loop form 0 to length of string
for (let i = 0; i < str.length; i++) {
if (!map.has(str[i]))
map.set(str[i],0);
map.set(str[i], map.get(str[i]) + 1);
}
// declaration of variables
let first = true , second = true ;
let val1 = 0, val2 = 0;
let countOfVal1 = 0, countOfVal2 = 0;
for (let [key, value] of map.entries()) {
let i = value;
// if first is true than countOfVal1 increase
if (first) {
val1 = i;
first = false ;
countOfVal1++;
continue ;
}
if (i == val1) {
countOfVal1++;
continue ;
}
// if second is true than countOfVal2 increase
if (second) {
val2 = i;
countOfVal2++;
second = false ;
continue ;
}
if (i == val2) {
countOfVal2++;
continue ;
}
return false ;
}
if (countOfVal1 > 1 && countOfVal2 > 1) {
return false ;
} else {
return true ;
}
}
// Driver code
document.write(checkForVariation( "abcbc" ));
// This code is contributed by patel2127
</script>


输出:

true

另一种方法:使用内置Python函数

  • 使用以下公式计算所有字符的频率: 计数器() 作用
  • 将这些频率转换为列表。
  • 使用计数器再次计算此列表的频率。
  • 如果计数器的长度为1,则返回true。
  • 如果计数器的长度为2,如果最小值为1,则返回true。
  • 否则返回False。

以下是实施情况:

Python3

# Python program
from collections import Counter
# To check a string S can be
# converted to a variation
# string
def checkForVariation(strr):
freq = Counter(strr)
# Converting these values to list
valuelist = list (freq.values())
# Counting frequencies again
ValueCounter = Counter(valuelist)
if ( len (ValueCounter) = = 1 ):
return True
else if ( len (ValueCounter) = = 2 and
min (ValueCounter.values()) = = 1 ):
return True
# If no conditions satisfied return false
return False
# Driver code
string = "abcbc"
# passing string to checkForVariation Function
print (checkForVariation(string))
# This code is contributed by vikkycirus


输出:

true

时间复杂性: O(n)

空间复杂性: O(n)

本文由 尼桑特·辛格(平图) .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享