лексикографическое создание самой большой и маленькой подстроки - PullRequest
1 голос
/ 23 февраля 2020

постановка задачи:

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

код:

public class Solution {

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

        for (int i = 1; i <= s.length() - k; i++) { //This line
            // Create a substring of length 'k'
            substring = s.substring(i, i + k);

            // If current substring is lexicographically smaller than 'smallest'
            if (substring.compareTo(smallest) < 0) {
                smallest = substring;
            }

            // If current substring is lexicographically larger than 'largest'
            if (substring.compareTo(largest) > 0) {
                largest = substring;
            }
        }

        return smallest + "\n" + largest;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        int k = scan.nextInt();
        scan.close();

        System.out.println(getSmallestAndLargest(s, k));
    }
}

Не могу понять механизм отмеченной строки в коде. Кто-нибудь может мне это объяснить?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Полагаю, вы говорите о следующем:

for (int i = 1; i <= s.length() - k; i++) { //This line

Если k - желаемая длина, вам нужно убедиться, что вы не выполняете итерации за пределами строк effective length, чтобы разрешить все подстроки длины k. Вычитание k просто корректирует точку завершения для достижения этой цели.

Вот пример.

k = 5 and string length is 13.

Цель состоит в том, чтобы выполнить итерацию до 8, поэтому что из 9 thru 13 остается строка длиной 5. Если мы продолжим дальше, строки будут меньше 5, и может произойти ошибка.

Попробуйте выполнить следующее:

       String str = "abcdefghij";
       int k = 4;

       for (int i = 0; i <= str.length() - k; i++) {
           System.out.println(str.substring(i,i+k));
       }

Обратите внимание, что последняя подстрока - ghij, которая является желаемой результат.

1 голос
/ 23 февраля 2020

Для l oop содержит s.length() - k, потому что мы создаем новую подстроку каждый раз, когда итерация l oop. Мы не хотим, чтобы конец подстроки выходил за пределы переданной строки, поэтому мы должны убедиться, что начало подстроки не будет go мимо s.length() - k.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...