📌  相关文章
📜  检查字符串是否具有相同频率的所有字符并允许一种变化

📅  最后修改于: 2022-05-13 01:57:07.787000             🧑  作者: Mango

检查字符串是否具有相同频率的所有字符并允许一种变化

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

Input : string str = "abbca"
Output : Yes
We can make it valid by removing "c"

Input : string str = "aabbcd"
Output : No
We need to remove at least two characters
to make it valid.

Input : string str = "abbccd"
Output : No

我们只允许遍历字符串一次。

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

C++
// C++ program to check if a string can be made
// valid by removing at most 1 character.
#include
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 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


C++
// C++ program to check if a string can be made
// valid by removing at most 1 character using hashmap.
#include 
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 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::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 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 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 map = new Dictionary();
         
        // 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 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


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


输出:

YES

我们只遍历字符串一次。第一个循环之后的三个循环也总共运行 CHARS 次。
另一种方法:(使用HashMap)
下面是实现。

C++

// C++ program to check if a string can be made
// valid by removing at most 1 character using hashmap.
#include 
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 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::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 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 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 map = new Dictionary();
         
        // 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 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


输出:

true

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

  • 使用Counter()函数计算所有字符的频率。
  • 将这些频率转换为列表。
  • 使用 Counter 再次计算该列表的频率。
  • 如果 Counter 的长度为 1,则返回 true。
  • 如果 Counter 的长度为 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)