Ниже демонстрационный вопрос от кодирования интервью сайта под названием codility:Максимального продукт префикс строка
Префиксом из строки S является любой ведущей смежной части S. Например, «с» и «треск "являются префиксами строки" codility ". Для простоты мы требуем, чтобы префиксы были непустыми.
Произведение префикса P строки S представляет собой число вхождений P, умноженное на длину P. Точнее, если префикс P состоит из K символов, а P имеет ровно T раз в S, то произведение равно K * Т.
Например, S = "abababa" имеет следующие префиксы:
- "а", у которых произведение равно 1 * 4 = 4,
- "AB", продукт которого равен 2 * 3 = 6,
- «aba», продукт которого равен 3 * 3 = 9,
- "ABAB", продукт которого равен 4 * 2 = 8,
- "Абебу", продукт которого равен 5 * 2 = 10,
- "ABABAB", продукт которого равен 6 * 1 = 6,
- «Абабаба», продукт которого равен 7 * 1 = 7.
Самый длинный префикс идентичен исходной строке. Цель состоит в том, чтобы выбрать такой префикс, который максимизирует ценность продукта. В приведенном выше примере максимальный продукт равен 10.
Ниже мое слабое решение на Java требует O (N^2) времени. По-видимому, это возможно сделать в O (N). Я думал о алгоритме Каданеса. Но я не могу придумать, каким образом я могу кодировать некоторую информацию на каждом шаге, что позволяет мне найти макс. Может ли кто-нибудь подумать об алгоритме O (N) для этого?
import java.util.HashMap;
class Solution {
public int solution(String S) {
int N = S.length();
if(N<1 || N>300000){
System.out.println("Invalid length");
return(-1);
}
HashMap<String,Integer> prefixes = new HashMap<String,Integer>();
for(int i=0; i<N; i++){
String keystr = "";
for(int j=i; j>=0; j--) {
keystr += S.charAt(j);
if(!prefixes.containsKey(keystr))
prefixes.put(keystr,keystr.length());
else{
int newval = prefixes.get(keystr)+keystr.length();
if(newval > 1000000000)return 1000000000;
prefixes.put(keystr,newval);
}
}
}
int maax1 = 0;
for(int val : prefixes.values())
if(val>maax1)
maax1 = val;
return maax1;
}
}
Не должен ли внутренний цикл (j) повторять в порядке возрастания? –
Я предполагаю, что, возможно, дерево суффиксов для инвертированной строки (построенное на O (n) времени) с O (1) запросами для суффиксов могло бы решить проблему в течение требуемого временного ограничения – higuaro
Little Santi - If мы просто хотим найти максимальный продукт, это не имеет значения. Причина, по которой я это делаю, заключается в том, что решение o (n), вероятно, будет выглядеть и назад, и я подумал. –