Самый быстрый способ вычислить все подстроки строки и проверить ее на заданное условие

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

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

Я пробовал наивный подход грубой силы, но он не работал для строк длиной 10^7. Пожалуйста помочь :(

for(int c = 0 ; c < length ; c++ )
        {
            for( i = 3 ; i <= length - c ; i++ )
            {
                String sub = str.substring(c, c+i);
                System.out.println(sub);
                if(sub.charAt(0) == sub.charAt(sub.length()-1)){
                    count++;
                }
            }
        }

1 ответов


ваше текущее решение квадратично для размера входной строки или O (n^2)

вы можете решить это более эффективно, подсчитав вхождение каждого символа в строке, а затем подсчитав количество подстрок, которые могут быть созданы с этим символом.

Е. Г. если возникает персонаж в 4 раза, то это приводит к 3 + 2 + 1 = 6 подстрок.

для этого можно использовать следующую формулу:((n-1) * n) / 2

это приносит сложности алгоритма вплоть до O(n), потому что для подсчета каждого символа вам нужно только пересечь строку один раз.

Я верю, что этот код должен работать:

public static void main(String[] args) {
    String str = "xyzxyzxyzxyz";
    Map<Character, Integer> map = new HashMap<>();
    for (char c : str.toCharArray())
    {
        Integer count = map.get(c);
        if (count == null)
            count = 0;
        map.put(c, count + 1);
    }
    int sum = 0;
    for (int n : map.values())
        sum += ((n - 1) * n) / 2;
    System.out.println(sum);
}