Sau đây là một câu hỏi bản demo từ một trang web phỏng vấn mã hóa gọi là codility:sản phẩm tối đa tiền tố chuỗi
Một tiền tố của một chuỗi S là bất kỳ một phần tiếp giáp hàng đầu của S. Ví dụ, "c" và "cá tuyết "là tiền tố của chuỗi" mã hóa ". Để đơn giản, chúng tôi yêu cầu tiền tố không trống.
Sản phẩm của tiền tố P của chuỗi S là số lần xuất hiện của P nhân với chiều dài của P. Chính xác hơn, nếu tiền tố P bao gồm ký tự K và P xuất hiện chính xác T lần trong S, thì sản phẩm bằng K * T.
Ví dụ, S = "abababa" có các tiền tố sau:
- "a", mà sản phẩm bằng 1 * 4 = 4,
- "ab", mà sản phẩm bằng 2 * 3 = 6,
- "aba", có sản phẩm bằng 3 * 3 = 9,
- "abab", có sản phẩm tương đương với 4 * 2 = 8,
- "Ababa", có sản phẩm tương đương với 5 * 2 = 10,
- "ababab", có sản phẩm tương đương với 6 * 1 = 6,
- "abababa", có sản phẩm bằng 7 * 1 = 7.
Tiền tố dài nhất giống với chuỗi gốc. Mục tiêu là chọn một tiền tố như tối đa hóa giá trị của sản phẩm. Trong ví dụ trên, sản phẩm tối đa là 10.
Dưới đây là giải pháp kém của tôi trong Java yêu cầu thời gian O (N^2). Nó rõ ràng là có thể làm điều này trong O (N). Tôi đã suy nghĩ thuật toán Kadanes. Nhưng tôi không thể nghĩ ra bất kỳ cách nào mà tôi có thể mã hóa một số thông tin ở mỗi bước cho phép tôi tìm giá trị tối đa đang chạy. Bất kỳ ai có thể nghĩ về một thuật toán O (N) cho điều này?
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;
}
}
Không nên vòng lặp bên trong (j) lặp lại theo thứ tự tăng dần? –
Tôi đoán ở đây, nhưng tôi nghĩ rằng có thể là một cây hậu tố cho chuỗi ngược (được xây dựng trên O (n) thời gian) với O (1) truy vấn cho hậu tố có thể giải quyết vấn đề trong thời hạn bắt buộc – higuaro
Little Santi - Nếu chúng tôi chỉ muốn tìm sản phẩm tối đa không quan trọng. Lý do tôi có nó như thế này là một giải pháp o (n) có lẽ sẽ nhìn về phía sau quá tôi nghĩ. –