Как найти первый набор символов, который не содержит повторяющихся символов, стоящих рядом друг с другом в строке

Я пробовал, как в приведенном ниже коде, но он работает только в том случае, если есть только один набор символов, и набор символов отображается в середине строки. Если набор появляется более одного раза и появляется в конце или начале строки, результат будет ложным.

    String str = "aaabbccdddefghjjkklmn";

for(int i = 1; i < str.length() - 1; i++){
    if (str.charAt(i) != str.charAt(i+1) && str.charAt(i) != str.charAt(i-1)){
        System.out.print(str.charAt(i));
    }
}

С приведенной выше строкой результат должен быть только «efgh», но приведенный выше код отображает «efghlm».

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш метод правильный. Просто вам нужно разорвать цикл, как только будет найден повторяющийся символ, ПОСЛЕ того, как вы нашли первый набор неповторяющихся символов.

Ниже приведен фрагмент кода, эквивалентный вашему коду на JavaScript.

 var str = "aaabbccdddefghjjkklmn";

var result = "";
for(var i = 1; i < str.length - 1; i++){
    // Find for non-repeating character
    if (str.charAt(i) != str.charAt(i+1) && str.charAt(i) != str.charAt(i-1)){
        result += str.charAt(i)
    }
    else {
      // Repeating character found
      // exit loop if non-repeating character already
      // found
      if (result.length > 0) {
        break;
      }
    }
}

console.info(result);

Это по-прежнему не обрабатывает возможность того, что символы с индексами 0 или str.length -1 не являются повторами своих соседей.

Jeremy Owens 31.05.2019 06:03
Ответ принят как подходящий

Проблема, из-за которой вы пропускаете начальное и конечное значения, заключается в том, как вы построили цикл for.

Так должно быть:

for (int i = 0; i < str.length(); i++)

Поэтому вам нужно по-разному обрабатывать крайние случаи.

if ( (i+1 >= str.length() || str.charAt(i) != str.charAt(i+1)) && (i-1 < 0 || str.charAt(i) != str.charAt(i-1)) )

Таким образом, вы включаете первый и последний индексы, не выходя за пределы диапазона. Кроме того, если вы хотите убедиться, что вы получаете только первый экземпляр символов, вам нужен код, чтобы выйти из цикла. Присвойте логическому значению значение true, когда проверка возвращает значение true. Если проверка возвращает false, проверьте, верно ли найденное вами логическое значение. Если это так, вырваться из петли.

boolean foundMatch = false;
for (int i = 0; i < str.length(); i++) {
    if ( (i+1 >= str.length() || str.charAt(i) != str.charAt(i+1)) && (i-1 < 0 || str.charAt(i) != str.charAt(i-1)) ) {
        System.out.print(str.charAt(i));
        foundMatch = true;
    }
    else {
        if (foundMatch == true) break;
    }
}

Другие вопросы по теме