使用相同字符集按字典顺序排列的下一个更大的字符串
给定一个数字 K 和一个字符串S,我们必须找到长度为 K 的字典上最小的字符串str,使得它的字母集是 S 的字母集的子集,并且 S 在字典上小于 str。
例子:
Input :k = 3
s = zbf
Output: zbz
Explanation: zbz is greater than zbf and it is
smaller than any other lexicographically greater
string than zbf
Input :k = 3
s = gi
Output: gig
Explanation: gig > gi and size is 3.
方法:如果字符串的大小小于 k,我们应该简单地从 s 中添加 k – s.size() 最小符号。
如果字符串的大小大于或等于k,那么我们需要替换字符串最小符号的前k个符号的后缀中的所有符号,并将该后缀之前的字符替换为字符串中存在的下一个更大的字符。
注意:如果字符串中的 k – 1 索引包含最大字符,那么我们将向后移动一个索引并向后移动,直到找到一个不等于最大字符的字符。
C++
// C++ implementation of above algorithm.
#include
using namespace std;
// function to print output
void lexoString(string s, int k)
{
int n = s.size();
// to store unique characters of the string
vector v;
// to check uniqueness
map mp;
for (int i = 0; i < s.size(); i++) {
if (mp[s[i]] == 0) {
// if mp[s[i]] = 0 then it is
// first time
mp[s[i]] = 1;
v.push_back(s[i]);
}
}
// sort the unique characters
sort(v.begin(), v.end());
// simply add n-k smallest characters
if (k > n)
{
cout << s;
for (int i = n; i < k; i++) {
cout << v[0];
}
return; // end the program
}
// searching the first character left of
// index k and not equal to greatest
// character of the string
for (int i = k - 1; i >= 0; i--) {
if (s[i] != v[v.size() - 1]) {
for (int j = 0; j < i; j++) {
cout << s[j];
}
// finding the just next greater
// character than s[i]
for (int j = 0; j < v.size(); j++) {
if (v[j] > s[i]) {
cout << v[j];
break;
}
}
// suffix with smallest character
for (int j = i + 1; j < k; j++)
cout << v[0];
return;
}
}
// if we reach here then all indices to the left
// of k had the greatest character
cout << "No lexicographically greater string of length "
<< k << " possible here.";
}
// Driver code
int main()
{
string s = "gi";
int k = 3;
// Function call
lexoString(s, k);
return 0;
}
Java
// Java implementation of above algorithm.
import java.util.*;
class GFG
{
// function to print output
static void lexoString(char[] s, int k)
{
int n = s.length;
// to store unique characters of the string
Vector v = new Vector<>();
// to check uniqueness
Map mp = new HashMap<>();
for (int i = 0; i < s.length; i++)
{
if (!mp.containsKey(s[i]))
{
// if mp[s[i]] = 0 then it is
// first time
mp.put(s[i], 1);
v.add(s[i]);
}
}
// sort the unique characters
Collections.sort(v);
// simply add n-k smallest characters
if (k > n)
{
System.out.print(String.valueOf(s));
for (int i = n; i < k; i++)
{
System.out.print(v.get(0));
}
return; // end the program
}
// searching the first character left of
// index k and not equal to greatest
// character of the string
for (int i = k - 1; i >= 0; i--)
{
if (s[i] != v.get(v.size() - 1))
{
for (int j = 0; j < i; j++)
{
System.out.print(s[j]);
}
// finding the just next greater
// character than s[i]
for (int j = 0; j < v.size(); j++)
{
if (v.get(j) > s[i])
{
System.out.print(v.get(j));
break;
}
}
// suffix with smallest character
for (int j = i + 1; j < k; j++)
{
System.out.print(v.get(0));
}
return;
}
}
// if we reach here then all indices to the left
// of k had the greatest character
System.out.print("No lexicographically greater string of length "
+ k + " possible here.");
}
// Driver code
public static void main(String arr[])
{
String s = "gi";
int k = 3;
// Function call
lexoString(s.toCharArray(), k);
}
}
// This code contributed by Rajput-Ji
Python3
# Python 3 implementation of above algorithm.
# function to print output
def lexoString(s, k):
n = len(s)
# to store unique characters
# of the string
v = []
# to check uniqueness
mp = {s[i]:0 for i in range(len(s))}
for i in range(len(s)):
if (mp[s[i]] == 0):
# if mp[s[i]] = 0 then it is
# first time
mp[s[i]] = 1
v.append(s[i])
# sort the unique characters
v.sort(reverse = False)
# simply add n-k smallest characters
if (k > n):
print(s, end = "")
for i in range(n, k, 1):
print(v[0], end = "")
return;
# end the program
# searching the first character left of
# index k and not equal to greatest
# character of the string
i = k - 1
while(i >= 0):
if (s[i] != v[len(v) - 1]):
for j in range(0, i, 1):
print(s[j], end = " ")
# finding the just next greater
# character than s[i]
for j in range(0, len(v), 1):
if (v[j] > s[i]):
print(v[j], end = " ")
break
# suffix with smallest character
for j in range(i + 1, k, 1):
print(v[0], end = " ")
re1turn
i -= 1
# if we reach here then all indices to
# the left of k had the greatest character
print("No lexicographically greater",
"string of length", k, "possible here.")
# Driver code
if __name__ == '__main__':
s = "gi"
k = 3
# Function call
lexoString(s, k)
# This code is contributed by
# Shashank_Sharma
C#
// C# implementation of above algorithm.
using System;
using System.Collections.Generic;
class GFG
{
// function to print output
static void lexoString(char[] s, int k)
{
int n = s.Length;
// to store unique characters of the string
List v = new List();
// to check uniqueness
Dictionary mp = new Dictionary();
for (int i = 0; i < s.Length; i++)
{
if (!mp.ContainsKey(s[i]))
{
// if mp[s[i]] = 0 then it is
// first time
mp.Add(s[i], 1);
v.Add(s[i]);
}
}
// sort the unique characters
v.Sort();
// simply add n-k smallest characters
if (k > n)
{
Console.Write(String.Join("", s));
for (int i = n; i < k; i++)
{
Console.Write(v[0]);
}
return; // end the program
}
// searching the first character left of
// index k and not equal to greatest
// character of the string
for (int i = k - 1; i >= 0; i--)
{
if (s[i] != v[v.Count - 1])
{
for (int j = 0; j < i; j++)
{
Console.Write(s[j]);
}
// finding the just next greater
// character than s[i]
for (int j = 0; j < v.Count; j++)
{
if (v[j] > s[i])
{
Console.Write(v[j]);
break;
}
}
// suffix with smallest character
for (int j = i + 1; j < k; j++)
{
Console.Write(v[0]);
}
return;
}
}
// if we reach here then all indices to the left
// of k had the greatest character
Console.Write("No lexicographically greater " +
"string of length " + k +
" possible here.");
}
// Driver code
public static void Main(String []arr)
{
String s = "gi";
int k = 3;
// Function call
lexoString(s.ToCharArray(), k);
}
}
// This code is contributed by Princi Singh
Javascript
输出:
gig
时间复杂度: O(k + s.size())