Самый быстрый способ вычислить все подстроки строки и проверить ее на заданное условие
каков самый быстрый способ вычислить все возможные подстроки данной строки и проверить их на наличие следующего условия.
условие: Если первый и последний символ сгенерированной подстроки одинаковы, то 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);
}