📌  相关文章
📜  修改字符串,使其至少包含所有元音一次

📅  最后修改于: 2021-05-05 02:32:51             🧑  作者: Mango

给定一个仅包含大写字母的字符串S,任务是找到用所有元音获得一个字符串所需的最少字符替换数,如果我们不能制作所需的字符串,则打印不可能。

例子

Input: str = "ABCDEFGHI"
Output: AOUDEFGHI
There are already 3 Vowels present in the string 
A, E, I we just change B and C to O and U respectively.

Input: str = "ABC"
Output: IMPOSSIBLE

方法:由于只有5个元音A,E,I,O,U。因此,如果字符串长度小于5,则总是不可能的。
对于长度大于等于5的字符串,总是可能的。只需遍历每个字符并用字符串中不存在的元音代替。如果当前字符是元音,并且如果不早点访问它,则我们不会将字符更改为元音。如果所有元音从一开始就已经存在,则无需更改任何字符。

下面是上述方法的实现:

C++14
// C++14 implementation of the above approach
#include 
using namespace std;
 
void addAllVowel(string str)
{
    // All vowels
    char x[] = {'A', 'E', 'I', 'O', 'U'};
 
    // List to store distinct vowels
    vector y;
    int length = str.length();
 
    // if length of string is less than 5
    // then always Impossible
    if (length < 5)
        cout << "Impossible" << endl;
    else
    {
        // Storing the distinct vowels in the string
        // by checking if it in the list of string and not
        // in the list of distinct vowels
        for (int i = 0; i < length; i++)
        {
            if (find(x, x + 5, str[i]) != x + 5 and
                find(y.begin(), y.end(), str[i]) == y.end())
                y.push_back(str[i]);
        }
 
        // Storing the vowels which are
        // not present in the string
        vector z;
        for (int i = 0; i < 5; i++)
            if (find(y.begin(),
                     y.end(), x[i]) == y.end())
                z.push_back(x[i]);
 
        // No replacement needed condition
        if (z.empty())
            cout << str << endl;
        else
        {
            int cc = 0;
            vector y;
 
            // Replacing the characters to get all Vowels
            for (int i = 0; i < length; i++)
            {
                if (find(x, x + 5, str[i]) != x + 5 and
                    find(y.begin(), y.end(),
                         str[i]) == y.end())
                    y.push_back(str[i]);
                else
                {
                    str[i] = z[cc];
                    cc++;
                }
                if (cc == z.size()) break;
            }
            cout << str << endl;
        }
    }
}
 
// Driver Code
int main(int argc, char const *argv[])
{
    string str = "ABCDEFGHI";
    addAllVowel(str);
    return 0;
}
 
// This code is contributed by
// sanjeev2552


Java
// Java implementation of the above approach
import java.util.*;
class GFG
{
     
static boolean find(char x[], char c)
{
    for(int i = 0; i < x.length; i++)
    if(x[i] == c)
    return true;
    return false;
}
 
static boolean find(Vector v,char c)
{
    for(int i = 0; i < v.size(); i++)
    if(v.get(i) == c)
    return true;
    return false;
}
 
static void addAllVowel(String str)
{
    // All vowels
    char x[] = {'A', 'E', 'I', 'O', 'U'};
 
    // List to store distinct vowels
    Vector y = new Vector<>();
    int length = str.length();
 
    // if length of String is less than 5
    // then always Impossible
    if (length < 5)
        System.out.println("Impossible");
    else
    {
        // Storing the distinct vowels in the String
        // by checking if it in the list of String and not
        // in the list of distinct vowels
        for (int i = 0; i < length; i++)
        {
            if (find(x, str.charAt(i))&&
                !find(y, str.charAt(i)))
                y.add(str.charAt(i));
        }
 
        // Storing the vowels which are
        // not present in the String
        Vector z = new Vector<>();
        for (int i = 0; i < 5; i++)
            if (!find(y, x[i]) )
                z.add(x[i]);
 
        // No replacement needed condition
        if (z.size() == 0)
            System.out.println( str );
        else
        {
            int cc = 0;
            Vector y1 = new Vector<>();
            String ans = "";
         
            // Replacing the characters to get all Vowels
            for (int i = 0; i < length; i++)
            {
            if (find(x, str.charAt(i))&&
                !find(y1, str.charAt(i)))
                {
                    ans += str.charAt(i);
                    y1.add(str.charAt(i));
                }
                else
                {
                    ans += z.get(cc);
                    cc++;
                }
                if (cc == z.size())
                {
                    //copy th rest of the string
                    for(int j = i + 1; j < length; j++)
                    ans += str.charAt(j);
                    break;
                }
            }
            System.out.println(ans);
        }
    }
}
 
// Driver Code
public static void main(String args[])
{
    String str = "ABCDEFGHI";
    addAllVowel(str);
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 implementation of the above approach
 
s = "ABCDEFGHI"
 
# converting String to a list
S = list(s) 
 
 # All vowels
x = ["A", "E", "I", "O", "U"]
 
 # List to store distinct vowels
y = []
le = len(S)
if (le < 5):
    # if length of string is less than 5 then always
    # Impossible
    print("Impossible")
else:
    # Storing the distinct vowels in the string
    # by checking if it in the list of string and not
    # in the list of distinct vowels
    for i in range(le):
        if (S[i] in x and S[i] not in y):
            y.append(S[i])
 
    # Storing the vowels which are not present in the string
    z = []
    for i in range(5):
        if (x[i] not in y):
            z.append(x[i])
    if (len(z) == 0):
        # No replacement needed condition
        print(s)
    else:
        cc = 0
        y = []
 
        # Replacing the characters to get all Vowels
        for i in range(le):
            if (S[i] in x and S[i] not in y):
                y.append(S[i])
            else:
                S[i] = z[cc]
                cc += 1
            if (cc == len(z)):
                break
        print(*S, sep ="")


C#
// C# implementation of the above approach
using System;
using System.Collections;
 
class GFG{
      
static bool find(char []x, char c)
{
    for(int i = 0; i < x.Length; i++)
        if  (x[i] == c)
            return true;
             
    return false;
}
  
static bool find(ArrayList v, char c)
{
    for(int i = 0; i < v.Count; i++)
        if ((char)v[i] == c)
            return true;
             
    return false;
}
  
static void addAllVowel(string str)
{
     
    // All vowels
    char []x = { 'A', 'E', 'I', 'O', 'U' };
  
    // List to store distinct vowels
    ArrayList y = new ArrayList();
     
    int length = str.Length;
  
    // If length of String is less than 5
    // then always Impossible
    if (length < 5)
        Console.Write("Impossible");
    else
    {
         
        // Storing the distinct vowels in
        // the String by checking if it in
        // the list of String and not
        // in the list of distinct vowels
        for(int i = 0; i < length; i++)
        {
            if (find(x, str[i]) &&
               !find(y, str[i]))
                y.Add(str[i]);
        }
  
        // Storing the vowels which are
        // not present in the String
        ArrayList z = new ArrayList();
        for(int i = 0; i < 5; i++)
            if (!find(y, x[i]) )
                z.Add(x[i]);
  
        // No replacement needed condition
        if (z.Count == 0)
            Console.Write(str);
        else
        {
            int cc = 0;
            ArrayList y1 = new ArrayList();
            string ans = "";
          
            // Replacing the characters to
            // get all Vowels
            for(int i = 0; i < length; i++)
            {
                if (find(x, str[i]) &&
                  !find(y1, str[i]))
                {
                    ans += str[i];
                    y1.Add(str[i]);
                }
                else
                {
                    ans += (char)z[cc];
                    cc++;
                }
                 
                if (cc == z.Count)
                {
                     
                    // Copy th rest of the string
                    for(int j = i + 1;
                            j < length; j++)
                        ans += str[j];
                        break;
                }
            }
            Console.Write(ans);
        }
    }
}
  
// Driver Code
public static void Main(string []args)
{
    string str = "ABCDEFGHI";
     
    addAllVowel(str);
}
}
 
// This code is contributed by rutvik_56


输出:
AOUDEFGHI

时间复杂度: O(N),其中N是字符串的大小

辅助空间: O(N)