Поиск пар в строках - PullRequest
       1

Поиск пар в строках

0 голосов
/ 27 сентября 2010

Мне было интересно, смогу ли я получить помощь в решении этой проблемы.Предположим, у меня есть строка

34342

Я хотел бы найти количество пар в этой строке, которое будет равно двум.Как мне это сделать?


РЕДАКТИРОВАТЬ: Хорошо, что я действительно хотел, чтобы соответствовать совпадениям символов, которые являются одинаковыми в строке.

Ответы [ 2 ]

7 голосов
/ 27 сентября 2010

Вы можете использовать обратные ссылки , чтобы найти пары вещей, которые появляются в строке:

(\d+)\1

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


Если вы хотите сопоставить числа, которые появляются в строке несколько раз, вы можете использовать шаблон, такой как

(\d)(?=\d*\1)

Снова мы используем обратную ссылку, но на этот раз мы также используем lookahead .Lookahead - это утверждение нулевой ширины , которое указывает что-то, что должно быть сопоставлено (или не сопоставлено, если используется отрицательный lookahead) после текущей позиции в строке, но не использует никаких символов и не перемещаетПоложение движка регулярных выражений в строке.В этом случае мы будем утверждать, что содержимое первой группы перехвата должно быть найдено снова, хотя не обязательно непосредственно рядом с первой.Указав \d* в предпросмотре, она будет считаться парой, только если она находится в пределах одного и того же числа (поэтому, если между числами есть пробел, пара не будет сопоставлена ​​- если это нежелательно, \dможно изменить на ., что будет соответствовать любому символу).

Соответствует первым 3 и 4 в 34342 и первым 1, 2, 3 и 4 в 12332144.Однако обратите внимание, что если у вас есть нечетное количество повторений, вы получите дополнительное совпадение (т. Е. 1112 будет соответствовать первым двум 1), потому что предпросмотры не потребляют.

0 голосов
/ 27 сентября 2010

Вот один из способов, если регулярное выражение не кажется подходящим.Один метод здесь использует карту, другой использует чистые массивы.Я действительно не знаю, что такое пара.«555» - это три пары, одна пара или как?Таким образом, эти процедуры выводят список всех символов, которые встречаются более одного раза.

public class Pairs {

    public static void main(String[] args) {
        usingMap("now is the time for all good men");
        System.out.println("-----------");
        usingArrays("now is the time for all good men");
    }

    private static void usingMap(String s) {
        Map<Character, Integer> m = new TreeMap<Character, Integer>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (m.containsKey(c)) {
                m.put(c, m.get(c) + 1);
            } else {
                m.put(c, 1);
            }
        }
        for (Character c : m.keySet()) {
            if (m.get(c) > 1) {
                System.out.println(c + ":" + m.get(c));
            }
        }
    }

    private static void usingArrays(String s) {
        int count[] = new int[256];
        for (int i = 0; i < count.length; i++) count[i] = 0;

        for (int i = 0; i < s.length(); i++) {
            count[s.charAt(i)]++;
        }
        for (int i = 0; i < count.length; i++) {
            if (count[i] > 1) {
                System.out.println((char) i + ":" + count[i]);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...