大小为 k 的字典上最小和最大的子串
给定字符串 str 和一个整数 k,找到长度为 k 的字典上最小和最大的子串
词典顺序,也称为字母顺序或字典顺序,
A < B <... < Y < Z < a < b <.. < y < z
例子:
Input : String: hello
Size: 2
Distinct Substring: [el, he, ll, lo]
Output : Smallest Substring: el
Largest Substring: lo
Input : String: geeksforgeeks
Size: 3
Distinct Substring: [eek, eks, for, gee, ksf, org, rge, sfo]
Output : Smallest Substring: eek
Largest Substring: sfo
我们将 max 和 min 初始化为大小为 k 的第一个子字符串。我们通过删除前一个子字符串的第一个字符并添加新字符串的最后一个字符来遍历剩余的子字符串。我们跟踪字典上最大和最小的。
C++
// CPP program to find lexicographically
// largest and smallest substrings of size k.
#include
using namespace std;
void getSmallestAndLargest(string s, int k)
{
// Initialize min and max as
// first substring of size k
string currStr = s.substr(0, k);
string lexMin = currStr;
string lexMax = currStr;
// Consider all remaining substrings. We consider
// every substring ending with index i.
for (int i = k; i < s.length(); i++)
{
currStr = currStr.substr(1, k) + s[i];
if (lexMax < currStr)
lexMax = currStr;
if (lexMin >currStr)
lexMin = currStr;
}
// Print result.
cout << (lexMin) << endl;
cout << (lexMax) << endl;
}
// Driver Code
int main()
{
string str = "GeeksForGeeks";
int k = 3;
getSmallestAndLargest(str, k);
}
// This code is contributed by
// Sanjit_Prasad
Java
// Java program to find lexicographically largest and smallest
// substrings of size k.
public class GFG {
public static void getSmallestAndLargest(String s, int k)
{
// Initialize min and max as first substring of size k
String currStr = s.substring(0, k);
String lexMin = currStr;
String lexMax = currStr;
// Consider all remaining substrings. We consider
// every substring ending with index i.
for (int i = k; i < s.length(); i++) {
currStr = currStr.substring(1, k) + s.charAt(i);
if (lexMax.compareTo(currStr) < 0)
lexMax = currStr;
if (lexMin.compareTo(currStr) > 0)
lexMin = currStr;
}
// Print result.
System.out.println(lexMin);
System.out.println(lexMax);
}
// Driver Code
public static void main(String[] args)
{
String str = "GeeksForGeeks";
int k = 3;
getSmallestAndLargest(str, k);
}
}
Python3
# Python 3 program to find lexicographically
# largest and smallest substrings of size k.
def getSmallestAndLargest(s, k):
# Initialize min and max as
# first substring of size k
currStr = s[:k]
lexMin = currStr
lexMax = currStr
# Consider all remaining substrings.
# We consider every substring ending
# with index i.
for i in range(k, len(s)):
currStr = currStr[1 : k] + s[i]
if (lexMax < currStr):
lexMax = currStr
if (lexMin >currStr):
lexMin = currStr
# Print result.
print(lexMin)
print(lexMax)
# Driver Code
if __name__ == '__main__':
str1 = "GeeksForGeeks"
k = 3
getSmallestAndLargest(str1, k)
# This code is contributed by
# Surendra_Gangwar
C#
// C# program to find lexicographically
// largest and smallest substrings of size k.
using System;
class GFG
{
// Function to compare two strings
static int CompareTo(String s1, String s2)
{
for (int i = 0; i < s1.Length ||
i < s2.Length; i++)
{
if (s1[i] < s2[i])
return -1;
else if (s1[i] > s2[i])
return 1;
}
return 0;
}
static void getSmallestAndLargest(String s, int k)
{
// Initialize min and max as
// first substring of size k
String currStr = s.Substring(0, k);
String lexMin = currStr;
String lexMax = currStr;
// Consider all remaining substrings.
// We consider every substring
// ending with index i.
for (int i = k; i < s.Length; i++)
{
currStr = currStr.Substring(1, k - 1) + "" + s[i];
if (CompareTo(lexMax, currStr) < 0)
lexMax = currStr;
if (CompareTo(lexMin, currStr) > 0)
lexMin = currStr;
}
// Print result.
Console.WriteLine(lexMin);
Console.WriteLine(lexMax);
}
// Driver Code
public static void Main(String[] args)
{
String str = "GeeksForGeeks";
int k = 3;
getSmallestAndLargest(str, k);
}
}
// This code is contributed by
// sanjeev2552
Javascript
输出:
For
sFo