Я пытаюсь решить проблему ранга Hacke - Шерлок и действительная строка, но мое кодирование не выполняется для двух тестовых случаев - PullRequest
0 голосов
/ 06 мая 2020

Шерлок считает строку действительной, если все символы строки встречаются одинаковое количество раз. Также допустимо, если он может удалить только символ 1 по индексу 1 в строке, а остальные символы будут встречаться одинаковое количество раз. Учитывая строку, определите, действительна ли она. Если да, верните YES, в противном случае верните NO.

Например, если s = ab c, это допустимая строка, потому что частоты: {a: 1, b: 1, c : 1} . То есть s = ab cc, потому что мы можем удалить один c и получить 1 каждого символа в оставшейся строке. Однако, если s = ab cc, строка недействительна, так как мы можем удалить только 1 вхождение c. Это оставит частоту символов {a: 1, b: 1, c: 1} .

Описание функции

Завершите функцию isValid в редакторе ниже . Он должен возвращать либо строку YES , либо строку NO .

isValid имеет следующие параметры:

s: строка

Формат ввода

Одна строка.

Ограничения

1 <= | s | <= 10 ^ 5 Каждый символ s [i] asciii [az] </p>

Формат вывода

Выведите YES, если строка действительна, в противном случае выведите NO.

Пример ввода 0 aabbcd Пример вывода 0 NO

Пример ввода 1 aabbccddeefghi

Пример вывода 1 НЕТ

Ниже мой код -

static String isValid(String s1) {
    int arr[]  = new int[26];
    final String YES = "YES";
    final String NO = "NO";
    for(int i=0;i<s1.length();i++){
        arr[s1.charAt(i)-'a']++;
    }
    Arrays.sort(arr);
    int i=0;
    while(arr[i] == 0){
        i++;
    }
    int min=i;
    int max=25;
    String isValid = NO;
    if(arr[min] == arr[max]) return isValid=YES;
    else if(arr[max]-arr[min] == 1){
        if( arr[max-1] == arr[min]) return isValid=YES;
        if( arr[min]==1 && arr[min+1] == arr[max]) return isValid=YES;
    }

    return isValid;

 }

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Это заняло много времени. Наконец я нашел, в чем проблема. Я обновил свое условие else if ниже.

  `else if(arr[max]-arr[min] == 1){
        if( arr[max-1] == arr[min]) return isValid=YES;
        if( arr[min]==1 && arr[min+1] == arr[max]) return isValid=YES;
    }`                                                                                 
  with                                                                               

else{ if(arr[max]-arr[min] == 1 && arr[max-1] == arr[min]) return isValid=YES; if(arr[min]==1 && arr[min+1] == arr[max]) return isValid=YES; }
Проблема в том, что входная строка s1 = "abbbbbb" , поскольку мы можем удалить 1 символ a он должен вернуть Да , но мой код возвращает НЕТ из-за условия if(arr[max]-arr[min] == 1)

0 голосов
/ 06 мая 2020

Эта строка вызывает проблему:

if(arr[max]-arr[min] ==1 && arr[min]==1 && arr[min+1] == arr[max]) return isValid=YES;

Что вы хотите сделать с arr[min+1] == arr[max]? Похоже, вы хотите проверить, можете ли вы просто добавить персонажа с наименьшим количеством появлений. Задача этого не требует. Просто удалите это предложение if. Тогда должно работать.

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