вывести лексикографически наименьшую и наибольшую подстроку заданного размера k из строки s

Это программа для печати лексикографически наименьшей и наибольшей подстроки размера k.

В этом решении есть часть, которую я действительно не понимаю. Может быть, кто-то может объяснить это мне.

 public static String getSmallestAndLargest(String s, int k) {
    String smallest = "";
    String largest = "";
    String currStr = s.substring(0, k); 

Вот часть, которую я не понимаю. почему int i инициализируется k и как

for(int i = k; i<s.length(); i++){
    currStr = currStr.substring(1, k) + s.charAt(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;             
    }       
    return smallest + "\n" + largest;
}

person ahhwhattdexxterr    schedule 08.04.2020    source источник


Ответы (1)


Идея алгоритма в том, что currStr проходит через все подстроки длины k. Он начинается с подстроки от индекса 0 до индекса k-1:

String currStr = s.substring(0, k); // end index is excluded!

Затем, чтобы получить следующую подстроку, от индекса 1 до k:

  • Сначала он отбрасывает первый символ из currStr, поэтому вы получаете подстроку от индекса 1 до индекса k-1.

  • Затем он добавляет символ из индекса k из входной строки. Конечным результатом является подстрока от индекса 1 до индекса k.

Затем этот процесс повторяется, чтобы получить подстроку от индекса 2 до k+1 и все последующие подстроки.

currStr = currStr.substring(1, k) // drop the first character from currStr
             + s.charAt(i);       // add next character from input string
person Joni    schedule 08.04.2020