Я пробовал, как в приведенном ниже коде, но он работает только в том случае, если есть только один набор символов, и набор символов отображается в середине строки. Если набор появляется более одного раза и появляется в конце или начале строки, результат будет ложным.
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».




Ваш метод правильный. Просто вам нужно разорвать цикл, как только будет найден повторяющийся символ, ПОСЛЕ того, как вы нашли первый набор неповторяющихся символов.
Ниже приведен фрагмент кода, эквивалентный вашему коду на 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);Проблема, из-за которой вы пропускаете начальное и конечное значения, заключается в том, как вы построили цикл 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;
}
}
Это по-прежнему не обрабатывает возможность того, что символы с индексами 0 или str.length -1 не являются повторами своих соседей.