以下是從編碼採訪現場稱爲codility演示問題:最大產品前綴字符串
一個串S的前綴是S的任何前導連續一部分。例如,「c」和「鱈魚「是字符串」可信度「的前綴。爲了簡單起見,我們要求前綴非空。
字符串S的前綴P的乘積是P的出現次數乘以P的長度。更確切地說,如果前綴P由K個字符組成並且P在S中恰好出現T次,那麼乘積等於K * T.
例如,S = 「ABABABA」 具有以下前綴:
- 「一」,其乘積等於1 * 4 = 4,
- 「AB」,其乘積等於2 * 3 = 6,
- 「aba」,其乘積等於3 * 3 = 9,
- 「ABAB」,其乘積等於4 * 2 = 8,
- 「巴」,其乘積等於5×2 = 10,
- 「ABABAB」,其乘積等於6 * 1 = 6,
- 「abababa」,其產品等於7 * 1 = 7.
最長的前綴與原始字符串相同。目標是選擇這樣的前綴以最大化產品的價值。在上面的例子中,最大的產品是10.
以下是我在Java中需要O(N^2)時間的糟糕解決方案。 O(N)顯然可以做到這一點。我在想Kadanes算法。但我想不出任何可以在每個步驟中編碼一些信息的方法,這些信息可以讓我找到最大運行時間。任何人都可以爲此考慮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)解決方案也可能會回想起我的想法。 –