вывести из строки s лексикографически наименьшую и наибольшую подстроку заданного размера k - PullRequest
0 голосов
/ 08 апреля 2020

Это программа для печати лексикографически самой маленькой и самой большой подстроки размера 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);

точно работает?


Полный l oop:

    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;
}

1 Ответ

0 голосов
/ 08 апреля 2020

Идея алгоритма, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...