给定一个包含小写字符的字符串str ,任务是找到按字典顺序排列的str的最大子序列。
例子:
Input: str = “abc”
Output: c
All possible sub-sequences are “a”, “ab”, “ac”, “b”, “bc” and “c”
and “c” is the largest among them (lexicographically)
Input: str = “geeksforgeeks”
Output: ss
方法:假设mx是字符串按字典顺序最大的字符。由于我们要按字典顺序排列最大的子序列,因此我们应包括所有出现的mx 。现在,在使用所有出现的字符之后,可以对剩余的字符串(即最后一次出现的mx之后的子字符串)重复相同的过程,依此类推,直到没有剩余的字符为止。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the lexicographically
// largest sub-sequence of s
string getSubSeq(string s, int n)
{
string res = "";
int cr = 0;
while (cr < n) {
// Get the max character from the string
char mx = s[cr];
for (int i = cr + 1; i < n; i++)
mx = max(mx, s[i]);
int lst = cr;
// Use all the occurrences of the
// current maximum character
for (int i = cr; i < n; i++)
if (s[i] == mx) {
res += s[i];
lst = i;
}
// Repeat the steps for the remaining string
cr = lst + 1;
}
return res;
}
// Driver code
int main()
{
string s = "geeksforgeeks";
int n = s.length();
cout << getSubSeq(s, n);
}
Java
// Java implementation of the approach
class GFG
{
// Function to return the lexicographically
// largest sub-sequence of s
static String getSubSeq(String s, int n)
{
String res = "";
int cr = 0;
while (cr < n)
{
// Get the max character from the String
char mx = s.charAt(cr);
for (int i = cr + 1; i < n; i++)
{
mx = (char) Math.max(mx, s.charAt(i));
}
int lst = cr;
// Use all the occurrences of the
// current maximum character
for (int i = cr; i < n; i++)
{
if (s.charAt(i) == mx)
{
res += s.charAt(i);
lst = i;
}
}
// Repeat the steps for
// the remaining String
cr = lst + 1;
}
return res;
}
// Driver code
public static void main(String[] args)
{
String s = "geeksforgeeks";
int n = s.length();
System.out.println(getSubSeq(s, n));
}
}
// This code is contributed by Rajput-Ji
Python3
# Python 3 implementation of the approach
# Function to return the lexicographically
# largest sub-sequence of s
def getSubSeq(s, n):
res = ""
cr = 0
while (cr < n):
# Get the max character from
# the string
mx = s[cr]
for i in range(cr + 1, n):
mx = max(mx, s[i])
lst = cr
# Use all the occurrences of the
# current maximum character
for i in range(cr,n):
if (s[i] == mx):
res += s[i]
lst = i
# Repeat the steps for the
# remaining string
cr = lst + 1
return res
# Driver code
if __name__ == '__main__':
s = "geeksforgeeks"
n = len(s)
print(getSubSeq(s, n))
# This code is contributed by
# Surendra_Gangwar
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to return the lexicographically
// largest sub-sequence of s
static String getSubSeq(String s, int n)
{
String res = "";
int cr = 0;
while (cr < n)
{
// Get the max character from
// the String
char mx = s[cr];
for (int i = cr + 1; i < n; i++)
{
mx = (char) Math.Max(mx, s[i]);
}
int lst = cr;
// Use all the occurrences of the
// current maximum character
for (int i = cr; i < n; i++)
{
if (s[i] == mx)
{
res += s[i];
lst = i;
}
}
// Repeat the steps for
// the remaining String
cr = lst + 1;
}
return res;
}
// Driver code
public static void Main(String[] args)
{
String s = "geeksforgeeks";
int n = s.Length;
Console.WriteLine(getSubSeq(s, n));
}
}
// This code is contributed by 29AjayKumar
PHP
输出:
ss
时间复杂度: O(N),其中N是字符串的长度。