本文概述
给定一个非空字符串S,任务是打印字符串S中包含交替元音和辅音的最长子序列。
注意:如果存在多个具有相同长度的子序列, 请打印其字符的ASCII值最大的子序列。
例子:
输入:S ="geeksforgeeks"
输出:gesores
解释:" gekorek", " gekores", " gekogek", " gekoges", " gesorek", " gesores", " gesogek", " gesoges", " geforek", " gefores" ", " gefogek"和" gefoges"是可能的最长子序列, 辅音和元音交替出现。 " gesores"是具有最大ASCII字符值之和的子序列, 因此是解决方案。
输入:S =" ababababab"
输出:ababababab
说明:" ababababab"是最长的子序列, 包含交替的元音和辅音。
方法:
请按照以下步骤解决问题:
- 存储的第一个字符的ASCII值小号作为当前块的最大值(马克西)和中的字符类型旗。如果字符是辅音, 则设置旗as0和1除此以外。
- 遍历字符串的其余部分。
- 对于每个字符, 检查它是否与前一个字符属于同一块。
- 如果属于同一区块, 请更新马克西到max(maxi, i的ASCII值th字符)。
- 否则, 请在字符后附加ASCII值马克西答案。存储当前i的ASCII值th字符为马克西。更新资料旗to(标志+1)%2表示当前字符的类型。
- 遍历整个字符串后, 请添加具有ASCII值的字符马克西答案。打印代表子序列的最后一个字符串。
下面的代码是上述方法的实现:
C ++
// C++ program to find the longest
// subsequence containing alternating
// vowels and consonants
#include <bits/stdc++.h>
using namespace std;
// Function that return 1 or 0
// if the given character is
// vowel or consonant respectively
int isVowel( char c)
{
// Returns 1 if c is vowel
if (c == 'a' || c == 'e' ||
c == 'i' || c == 'o' ||
c == 'u' )
return 1;
// Returns 0 if
// c is consonant
return 0;
}
// Function to find the longest
// subsequence containing
// alternate vowels and
// consonants
string Subsequence(string str)
{
// Store the length
// of the string
int n = str.length();
// Assume first character
// to be consonant
int flag = 0;
// If first character is vowel
if (isVowel(str[0]) == 1)
flag = 1;
// Store the ASCII value
int maxi = ( int )str[0];
// Stores the final answer
string ans = "" ;
for ( int i = 1; i < n; i++)
{
// If the current character belongs
// to same category (Vowel / Consonant)
// as the previous character
if (isVowel(str[i]) == flag)
{
// Store the maximum ASCII value
maxi = max(maxi, ( int )str[i]);
}
// Otherwise
else
{
// Store the character with
// maximum ASCII value from
// the previous block
ans += ( char )(maxi);
// Store the ASCII of the
// current character as the
// maximum of the current block
maxi = ( int )str[i];
// Switch the type of the
// current block
flag = (flag + 1) % 2;
}
}
// Store the chracter with
// maximum ASCII value
// from the last block
ans += ( char )(maxi);
// Return the result
return ans;
}
// Driver code
int main()
{
string str = "geeksforgeeks" ;
cout << (Subsequence(str));
}
// This code is contributed by chitranayal
Java
// Java program to find the longest
// subsequence containing alternating
// vowels and consonants
import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.*;
class GFG {
// Function that return 1 or 0
// if the given character is
// vowel or consonant respectively
static int isVowel( char c)
{
// Returns 1 if c is vowel
if (c == 'a' || c == 'e'
|| c == 'i' || c == 'o'
|| c == 'u' )
return 1 ;
// Returns 0 if
// c is consonant
return 0 ;
}
// Function to find the longest
// subsequence containing
// alternate vowels and
// consonants
static String Subsequence(String str)
{
// Store the length
// of the string
int n = str.length();
// Assume first character
// to be consonant
int flag = 0 ;
// If first character is vowel
if (isVowel(str.charAt( 0 )) == 1 )
flag = 1 ;
// Store the ASCII value
int maxi = ( int )str.charAt( 0 );
// Stores the final answer
String ans = "" ;
for ( int i = 1 ; i < n; i++) {
// If the current character belongs
// to same category (Vowel / Consonant)
// as the previous character
if (isVowel(str.charAt(i)) == flag) {
// Store the maximum ASCII value
maxi = Math.max(maxi, ( int )str.charAt(i));
}
// Otherwise
else {
// Store the character with
// maximum ASCII value from
// the previous block
ans += ( char )(maxi);
// Store the ASCII of the
// current character as the
// maximum of the current block
maxi = ( int )str.charAt(i);
// Switch the type of the
// current block
flag = (flag + 1 ) % 2 ;
}
}
// Store the chracter with
// maximum ASCII value
// from the last block
ans += ( char )(maxi);
// Return the result
return ans;
}
// Driver Program
public static void main(String[] args)
{
String str = "geeksforgeeks" ;
System.out.println(Subsequence(str));
}
}
Python3
# Python3 program to find the longest
# subsequence containing alternating
# vowels and consonants
def isVowel(c):
# boolean function that check whether
# the given char is vowel or not
# and returns a boolean value respectively
vowels = [ 'a' , 'e' , 'i' , 'o' , 'u' ]
if (c in vowels):
return True
return False
def Subsequence( str ):
#string that stores the final result
ans = ''
flag = (isVowel( str [ 0 ]))
#taking the first character
#as the maximum ASCII valued char
maxi = ord ( str [ 0 ])
for i in range ( 1 , len ( str )):
# If the current character belongs to
# same category(Vowel / Consonant) as the
# previous character
if (isVowel( str [i]) = = flag):
# choosing a maximum ASCII valued char
maxi = max (maxi, ord ( str [i]))
#otherwise
else :
ans = ans + chr (maxi)
maxi = ord ( str [i])
#toggling the flag
flag = not (flag)
#adding the last char to the answer
ans = ans + chr (maxi)
return ans
#Driver program
if __name__ = = "__main__" :
input_string = 'geeksforgeeks'
print (Subsequence(input_string))
# Contributed by
# Nvss Maneesh Gupta
C#
// C# program to find the longest
// subsequence containing alternating
// vowels and consonants
using System;
class GFG{
// Function that return 1 or 0
// if the given character is
// vowel or consonant respectively
static int isVowel( char c)
{
// Returns 1 if c is vowel
if (c == 'a' || c == 'e' ||
c == 'i' || c == 'o' ||
c == 'u' )
return 1;
// Returns 0 if
// c is consonant
return 0;
}
// Function to find the longest
// subsequence containing
// alternate vowels and
// consonants
static String Subsequence(String str)
{
// Store the length
// of the string
int n = str.Length;
// Assume first character
// to be consonant
int flag = 0;
// If first character is vowel
if (isVowel(str[0]) == 1)
flag = 1;
// Store the ASCII value
int maxi = ( int )str[0];
// Stores the readonly answer
String ans = "" ;
for ( int i = 1; i < n; i++)
{
// If the current character belongs
// to same category (Vowel / Consonant)
// as the previous character
if (isVowel(str[i]) == flag)
{
// Store the maximum ASCII value
maxi = Math.Max(maxi, ( int )str[i]);
}
// Otherwise
else
{
// Store the character with
// maximum ASCII value from
// the previous block
ans += ( char )(maxi);
// Store the ASCII of the
// current character as the
// maximum of the current block
maxi = ( int )str[i];
// Switch the type of the
// current block
flag = (flag + 1) % 2;
}
}
// Store the chracter with
// maximum ASCII value
// from the last block
ans += ( char )(maxi);
// Return the result
return ans;
}
// Driver code
public static void Main(String[] args)
{
String str = "geeksforgeeks" ;
Console.WriteLine(Subsequence(str));
}
}
// This code is contributed by 29AjayKumar
输出如下
gesores
时间复杂度:O(n)