Как проверить, что все символы в строке одинаковые?

Рейтинг: -4Ответов: 2Опубликовано: 24.02.2023

Допустим есть массив стрингов. Как проверить, что какие-то строки в нём состоят только из одинаковых символов? Например "aaaa", "bbbbb","ccc"?

Пример:

String[] texts = new String[50_000];

text[0] = "aaa";

text[1] = "abcc";

text[2] = "ccccc";

text[3] = "bbbb";

text[4] = "cca";

Ответы

▲ 2Принят

Для решения этой задачи можно написать функцию, которая будет проверять каждую строку на предмет того, состоит ли она только из одинаковых символов. Вот пример такой функции на языке Java:

public static boolean isSameCharacters(String s) {
    if (s == null || s.length() == 0) {
        return false;
    }
    char c = s.charAt(0);
    for (int i = 1; i < s.length(); i++) {
        if (s.charAt(i) != c) {
            return false;
        }
    }
    return true;
}

Эта функция принимает на вход строку s и проверяет, состоит ли она только из одинаковых символов. Если да, то функция возвращает true, иначе - false. Функция начинает проверку с первого символа строки s, сохраняет его в переменной c и сравнивает остальные символы с ним. Если какой-то символ отличается от c, то функция возвращает false. Если все символы одинаковые, то функция возвращает true.

Чтобы проверить все строки в массиве texts, можно пройтись по нему в цикле и вызвать функцию isSameCharacters() для каждой строки:

for (String s : texts) {
    if (isSameCharacters(s)) {
        System.out.println(s + " consists of same characters");
    }
}

Этот код пройдется по всем строкам в массиве texts, вызовет функцию isSameCharacters() для каждой из них и напечатает те, которые состоят только из одинаковых символов.

▲ 1

Можно с применением метода String::matches и регулярного выражения, например: "(.)\\1*" множество символов после первого может быть пустым, т.е. будет возвращаться true для строки из одного символа:

public static boolean allSame(String str) {
    return str != null && str.matches("(.)\\1*");
}

Если требуется, что после первого символа должен быть хотя бы один символ, регулярка меняется на "(.)\\1+".


Аналогичный однострочник с использованием Stream API:

public static boolean allSame(String str) {
    return str != null && !str.isEmpty() && str.chars().allMatch(c -> str.charAt(0) == c);
}