Answer:
Here is the JAVA program:
import java.util.*;
public class Solution { // class name
public static String getSmallestAndLargest(String s, int k) {
//method that takes a string s and and integer k and returns lexicographically smallest and largest substrings
String smallest = "";
//stores the smallest substring
String largest = "";
//stores the largest substring
smallest = largest = s.substring(0, k); //sets the smallest and largest to substring from 0-th start index and k-th end index of string s
for(int i = 0;i<=s.length()-k;i++){ //iterates through the string s till length()-k
String subString = s.substring(i,i+k); //stores the substring of string s from ith index to i+k th index
if(i == 0){
//if i is equal to 0
smallest = subString; } //assigns subString to smallest
if(subString.compareTo(largest)>0){
//checks if the subString is lexicographically greater than largest
largest = subString; //sets subString to largest
}else if(subString.compareTo(smallest)<0) //checks if the subString is lexicographically less than smallest
smallest = subString; }
//sets subString to smallest
return smallest + "\n" + largest; } //returns the lexicographically smallest and largest substrings
public static void main(String[] args) { //start of main method
Scanner scan = new Scanner(System.in); //creates Scanner object
String s = scan.next(); //scans and reads input string from user
int k = scan.nextInt(); //scans and reads integer k from user
scan.close();
System.out.println(getSmallestAndLargest(s, k)); } } //calls method by passing string s and integer k to it to display lexicographically smallest and lexicographically largest substring
Explanation:
The program takes a string s and an integer k and passes them to function getSmallestAndLargest that returns the lexicographically smallest and lexicographically largest substring. The method works as follows:
Lets say s = helloworld and k = 3
smallest = largest = s.substring(0, k);
s.substring(0, k); is returns the substring from 0th index to k-th index so it gives substring hel
for(int i = 0;i<=s.length()-k;i++) This loop iterates through the string s till s.length()-k times
s.length()-k is equal to 7 in this example
At first iteration:
i = 0
i<=s.length()-k is true so program enters the body of loop
String subString = s.substring(i,i+k); this becomes:
subString = s.substring(0,3);
subString = "hel"
if(i == 0) this is true so:
smallest = subString;
smallest = "hel"
At second iteration:
i = 1
i<=s.length()-k is true so program enters the body of loop
String subString = s.substring(i,i+k); this becomes:
subString = s.substring(1,4);
subString = "ell"
if(subString.compareTo(smallest)<0) this condition is true because the subString ell is compared to smallest hel and it is lexographically less than smallest so :
smallest = subString;
smallest = "ell"
So at each iteration 3 characters of string s are taken and if and else if condition checks if these characters are lexicographically equal, smaller or larger and the values of largest and smallest change accordingly
After the loop ends the statement return smallest + "\n" + largest; executes which returns the smallest and largest substrings. So the output of the entire program with given example is:
ell
wor
Here ell is the lexicographically smallest substring and wor is lexicographically largest substring in the string helloworld
The screenshot of the program along with its output is attached.