2013-09-04 33 views
5

Với vấn đề sau đây:Tìm khoảng thời gian nhỏ nhất của chuỗi đầu vào trong O (n)?

Định nghĩa:

Gọi S là một chuỗi trên bảng chữ cái Σ. S' là giai đoạn nhỏ nhất của S nếu S' là chuỗi nhỏ nhất sao cho:

S = (S')^k (S''),

nơi S'' là tiền tố của S. Nếu không có S' nào tồn tại, thì S là không định kỳ.

Ví dụ: S = abcabcabcabca. Sau đó, abcabc là khoảng thời gian từ S = abcabc abcabc a, nhưng khoảng thời gian nhỏ nhất là abc kể từ S = abc abc abc abc a.

Hãy cho một thuật toán để tìm ra khoảng thời gian nhỏ nhất của chuỗi đầu vào S hoặc tuyên bố rằng S là không định kỳ.

Gợi ý: Bạn có thể làm điều đó trong O(n) ...

Giải pháp của tôi: Chúng tôi sử dụng KMP, chạy trong thời gian O (n).

Theo định nghĩa của vấn đề, S = (S ')^k (S' '), sau đó tôi nghĩ rằng nếu chúng ta tạo một automata trong thời gian ngắn nhất, và tìm cách để tìm khoảng thời gian ngắn nhất, thì tôi xong rồi.

Vấn đề là nơi để đặt mũi tên FAIL của automata ...

ý tưởng Bất kỳ sẽ được đánh giá rất nhiều,

Trân

+0

Nó sẽ không được 'S = (S '') (S ')^k' nếu' S''' là một tiền tố, hoặc là này ký hiệu phụ thêm vào phía trước? – Mikeb

+1

@Mikeb: Không, hãy xem ví dụ: ở đây 'S = abcabcabcabca',' S '= abc' và 'S' '= a' ... vì' S''' là ký tự cuối cùng. – ron

+0

vì vậy nếu 'S = qweabcabcabc', chuỗi không phải là định kỳ? Đoán tôi chỉ có một ngôn ngữ ngụy biện, trong ví dụ của bạn tôi muốn gọi là 'S''' một hậu tố. – Mikeb

Trả lời

0

Tôi không chắc rằng tôi hiểu giải pháp cố gắng của bạn . KMP là một chương trình con hữu ích, mặc dù - khoảng thời gian nhỏ nhất là KMP di chuyển chuỗi kim bao xa (tức là, S) sau một kết hợp hoàn chỉnh.

0

sự cố này có thể được giải quyết bằng hàm Z, hướng dẫn this có thể giúp bạn.

0

Xem liệu giải pháp này có hoạt động với O (n) hay không. Tôi đã sử dụng luân phiên của chuỗi.

public static int stringPeriod(String s){ 

    String s1= s; 
    String s2= s1; 

    for (int i=1; i <s1.length();i++){ 
     s2=rotate(s2); 
     if(s1.equals(s2)){ 
      return i; 
     } 
    } 

    return -1; 
} 

public static String rotate(String s1){ 

    String rotS= s1; 

    rotS = s1.substring(1)+s1.substring(0,1); 

    return rotS; 

} 

Chương trình hoàn chỉnh có sẵn trong this github repository

+1

Điều này rõ ràng là 'O (n²) ' – fjardon

+0

@fjardon Chuỗi con là O (n). Đúng vậy! Đó là O (1) trong các phiên bản Java cũ hơn. –

+0

Nehal: string.equals là O (n). (Giả sử chuỗi bao gồm 'n-1' Theo sau là B. Sau đó, bạn cần phải so sánh nhân vật O (n²). Nhưng đó không phải là vấn đề: vấn đề là thuật toán chỉ hoạt động nếu chuỗi là hoàn toàn định kỳ (S '' là trống rỗng, theo định nghĩa của định kỳ.) – rici

Các vấn đề liên quan