Tìm Substrings đặc quyền


8

Chuỗi đặc quyền

Tập hợp các chuỗi đặc quyền được định nghĩa đệ quy như sau.

  • Tất cả các chuỗi có độ dài 0 hoặc 1 đều được đặc quyền.
  • Một chuỗi scó độ dài ít nhất 2 là đặc quyền, nếu tồn tại một chuỗi đặc quyền ngắn hơn txảy ra trong schính xác hai lần, một lần làm tiền tố và một lần là hậu tố. Sự xuất hiện chồng chéo được tính là khác biệt.

Ví dụ, các chuỗi aa, aaaabađược đặc quyền, nhưng abaabkhông.

Đầu vào

Một chuỗi ký tự chữ và số.

Đầu ra

Tất cả các chuỗi con đặc quyền của chuỗi đầu vào, mỗi chuỗi chính xác một lần, theo bất kỳ thứ tự nào. Đầu ra có thể được cung cấp ở định dạng mảng gốc của ngôn ngữ của bạn (hoặc tương đương gần nhất) hoặc in một chuỗi con trên mỗi dòng.

Sự thật thú vị

Số lượng chuỗi trong đầu ra luôn chính xác length(s) + 1( nguồn ).

Quy tắc

Cả hai chức năng và chương trình đầy đủ đều được cho phép. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

Chúng được sắp xếp đầu tiên theo chiều dài và sau đó theo thứ tự abc, nhưng bất kỳ thứ tự nào cũng được chấp nhận.

"" -> [""]
"a" -> ["","a"]
"abc" -> ["","a","b","c"]
"abcaaabccaba" -> ["","a","b","c","aa","cc","aaa","aba","abca","abcca","bccab","bcaaab","caaabc"]
"1010010110101010001101" -> ["","0","1","00","11","000","010","101","0110","1001","01010","10001","10101","010010","101101","0101010","1010101","01011010","10100101","1010001101","1101010100011","00101101010100","011010101000110"]
"CapsAndDigits111" -> ["","1","A","C","D","a","d","g","i","n","p","s","t","11","111","igi","sAndDigits"]

Bảng xếp hạng

Đây là bảng xếp hạng ngôn ngữ, lịch sự của Martin Büttner .

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes


Đầu ra có thể được phân tách bằng không gian hay nó phải được phân tách bằng các dòng mới? (nếu in)
Sp3000 8/2/2015

@ Sp3000 Nó phải là dòng mới hoặc ngôn ngữ của bạn in một chuỗi các chuỗi.
Zgarb 8/2/2015

2
Vì vậy, bạn đang yêu cầu chúng tôi kiểm tra các chuỗi đặc quyền của bạn?
imallett

Tại sao một định nghĩa dài như vậy? Bạn không thể viết một cách tương đương "một chuỗi riêng tư là một chuỗi bắt đầu và kết thúc với cùng một biểu tượng, biểu tượng cho biết không xuất hiện ở bất kỳ nơi nào khác trong chuỗi"? =)
Mint97

1
@ Mint97 Chuỗi ngắn hơn tcó thể không phải là một ký hiệu đơn lẻ. Ví dụ, aaalà một chuỗi đặc quyền, vì nó có aatiền tố và hậu tố và nó chỉ xảy ra hai lần. Tôi đã thêm nó như một ví dụ.
Zgarb

Câu trả lời:


4

.NET Regex, 31 byte

(?=(((?<=(\3\2|)).+?(?<=\3))*))

Các chuỗi được nắm bắt \1trong mỗi trận đấu.

Giải thích

(?=                             # Lookahead. This makes it possible to catch overlapped
                                #   strings in \1.
    (                           # The captured group \1 for result.
        (                       # Match 0 or more occurrences.
            (?<=(\3\2|))        # Set \3 to the string from last \3 to the current position,
                                #   or an empty string for the first time.
            .+?(?<=\3)          # Match a shortest nonempty string so that the whole string
                                #   from the beginning to the current position ends with \3.
        )*
    )
)

5

CJam, 33 45 39 38 byte

l_,,\f>{(0{:U2$>2$2$#):T<+UT+T}g;\;N}%

Hãy nói rằng nó được in mà không có một dòng mới. Vì vậy, dòng mới có nghĩa là một chuỗi con trống ...

Giải thích

l              " Read one line. ";
_,,            " Get an array of 0 to array length-1. ";
\f>            " Get all nonempty suffixes. ";
{              " For each suffix: ";
    (          " Extract the first character. Say the first character X and the rest Y. ";
    0          " Push U = 0. ";
    {          " Do: ";
        :U     " Set variable U. ";
        2$>    " Z = Y with first U characters removed. ";
        2$2$#  " Find X in Y, or return -1 if not found. ";
        ):T    " Increment and save it in T. ";
        <+     " Append the first T characters of Z to X. ";
        UT+    " U += T. ";
        T      " Push T. ";
    }g         " ...while T is nonzero. ";
    ;\;        " Discard U and Y. ";
    N          " Append a newline. ";
}%

4

Python 2, 179 173 164 byte

exec"f=lambda s:len(s)<2or any(s[1:-1].count(s[:n])<(s[:n]==s[-n:])==f(s[:n])for n%s);g=lambda s:filter(f,{''}|{s[i:j+1]for i%sfor j%s})"%((" in range(len(s))",)*3)

Hiện tại khá cồng kềnh - Tôi tự hỏi liệu có thể kết hợp kiểm tra và tạo chuỗi con bằng cách nào đó ...

Lambda fvề cơ bản là một is_privileged()hàm, kết hợp ba điều kiện thành một so sánh (chuỗi con là đặc quyền, xuất hiện hai lần, là hậu tố và tiền tố).

Mở rộng:

f=lambda s:len(s)<2or any(s[1:-1].count(s[:n])<(s[:n]==s[-n:])==f(s[:n])for n in range(len(s)))
g=lambda s:filter(f,{''}|{s[i:j+1]for i in range(len(s))for j in range(len(s))})

3

Python 3, 131 129 byte

f=lambda s,p={''}:(len(s)<2or[f(s[1:]),f(s[:-1])]*any(s[:len(x)]==s[-len(x):]==x not in s[1:-1]for x in p))and p.add(s)or list(p)

Điều này đệ quy tìm các chuỗi con đặc quyền, bắt đầu với các chuỗi con ngắn nhất và thêm chúng vào một tập hợp. Bộ này sau đó được sử dụng để xác định xem các chuỗi con dài hơn có được đặc quyền hay không.

Thật không may, nó là một chức năng chỉ sử dụng một lần. Đây là một chương trình đầy đủ tương ứng ( 145 byte ):

p={''}
f=lambda s:(len(s)<2or[f(s[1:]),f(s[:-1])]*any(s[:len(x)]==s[-len(x):]==x not in s[1:-1]for x in p))and p.add(s)
f(input())
print(list(p))

3

Python, 152 147 126 116 byte

def n(s):
 w='';t=[w]
 for a in s:w+=a;t+=[w[w.rfind(w[-max(len(q)for q in t if w.endswith(q)):],0,-1):]]
 return t

Như đã trình bày trong bài báo được liên kết, có một hậu tố đặc quyền duy nhất cho mỗi tiền tố của chuỗi. Hậu tố mà có dạng p·u·pnơi plà chuỗi đặc quyền tìm thấy trước đó dài nhất mà là một hậu tố của tiền tố. (Tìm kiếm là đối số max, thực sự tìm thấy độ dài pvì nó dễ thực hiện maxhơn longest.) Một khi pđược tìm thấy, hậu tố được hình thành bằng cách tìm kiếm lần xuất hiện cuối cùng thứ hai ptrong tiền tố, sử dụng rfindràng buộc để không sử dụng nhân vật cuối cùng. Chúng tôi biết rằng sẽ làm việc, bởi vì plà một hậu tố được tìm thấy trước đây. (Một bằng chứng chặt chẽ hơn về thuật toán có thể được lấy từ bài báo.)

Tôi khá chắc chắn rằng điều này có thể được thực hiện trong thời gian tuyến tính bằng cách sử dụng cây hậu tố, thay vì thuật toán bậc hai được sử dụng ở trên, nhưng chương trình trên chắc chắn đủ nhanh trong tất cả các trường hợp thử nghiệm và xử lý một chuỗi 2000 agiây trong một ít hơn một giây trên máy tính xách tay (không phải siêu cường) của tôi.


2

Ruby, 87

Tôi cảm thấy như có một giải pháp regex đệ quy ở đây ở đâu đó, nhưng tôi không giỏi lắm, vì vậy đây là một hàm đệ quy rất chậm và dài.

f=->s{s[/./]?(o=f[$']|f[s.chop];o.any?{|t|s[/^#{t}/]&&s[/.#{t}/]&&!$'[0]}&&o<<s;o):[s]}

Thuật toán gần giống như grc , được làm chậm hơn (nhưng ngắn hơn) bằng cách không ký tự đơn đặc biệt. Một chuỗi ký tự đơn có thể được coi là đặc quyền do có chuỗi trống làm tiền tố, hậu tố và không ở đâu khác.

Thủ thuật thú vị khác ở đây là sử dụng $', một biến ma thuật được thừa hưởng từ Perl, lấy giá trị của chuỗi sau khi khớp biểu thức chính quy gần đây nhất. Điều này cho tôi một cách ngắn gọn để cắt ký tự đầu tiên ra khỏi chuỗi, mặc dù tôi có được hầu hết tất cả các ký tự đó bằng cách phải thiết lập nó s[/./]thay vì s[0]. Tôi sử dụng nó một lần nữa để kiểm tra xem khớp chuỗi con thứ hai có xảy ra ở cuối chuỗi không.


1

J, 92 byte

Mất vài giây với đầu vào dài nhất.

pkiểm tra nếu một chuỗi được đặc quyền (có đệ quy), skiểm tra mọi chuỗi con bằng cách sử dụng p.

   p=.1:`(+./@:(($:@>@{.*((2=+/)*1={:)@{.@=)@(<\))~i.@#)@.(1<#)
   s=.3 :'~.a:,,(<@#~p)\.\y'   

Các xét nghiệm:

   s 'CapsAndDigits111'
┌┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬───┬─┬──────────┬─┬──┬───┐
││C│a│p│s│A│n│d│D│i│g│igi│t│sAndDigits│1│11│111│
└┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴───┴─┴──────────┴─┴──┴───┘       

   input =. '';'a';'ab';'abc';'abcaaabccaba';'1010010110101010001101';'CapsAndDigits111'

   s each input
┌──┬────┬──────┬────────┬─────────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────...
│┌┐│┌┬─┐│┌┬─┬─┐│┌┬─┬─┬─┐│┌┬─┬─┬─┬────┬──┬───┬──────┬──────┬──┬─────┬─────┬───┐│┌┬─┬─┬───┬───┬──┬────┬──────┬────────┬──┬────┬──────┬────────┬─────┬─────┬───────┬───────┬──────────────┬───┬─────┬─────────────┬───────────────┬──────────┐│┌┬─┬─┬─┬─┬─┬─┬─┬─┬─┬...
││││││a││││a│b││││a│b│c││││a│b│c│abca│aa│aaa│bcaaab│caaabc│cc│abcca│bccab│aba││││1│0│101│010│00│1001│010010│10100101│11│0110│101101│01011010│10101│01010│1010101│0101010│00101101010100│000│10001│1101010100011│011010101000110│1010001101││││C│a│p│s│A│n│d│D│i│...
│└┘│└┴─┘│└┴─┴─┘│└┴─┴─┴─┘│└┴─┴─┴─┴────┴──┴───┴──────┴──────┴──┴─────┴─────┴───┘│└┴─┴─┴───┴───┴──┴────┴──────┴────────┴──┴────┴──────┴────────┴─────┴─────┴───────┴───────┴──────────────┴───┴─────┴─────────────┴───────────────┴──────────┘│└┴─┴─┴─┴─┴─┴─┴─┴─┴─┴...
└──┴────┴──────┴────────┴─────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────...

   #@s each input NB. number of strings in outputs
┌─┬─┬─┬─┬──┬──┬──┐
│1│2│3│4│13│23│17│
└─┴─┴─┴─┴──┴──┴──┘

   # each input NB. input lengths
┌─┬─┬─┬─┬──┬──┬──┐
│0│1│2│3│12│22│16│
└─┴─┴─┴─┴──┴──┴──┘

1

JavaScript (ES6) 195

Hàm P xác nhận đệ quy rằng một chuỗi là đặc quyền.
Hàm F thử mọi chuỗi con chứa trong chuỗi đã cho. Các chuỗi tìm thấy được lưu trữ dưới dạng các khóa của hàm băm để tránh trùng lặp.
Cuối cùng, các phím được trả về như đầu ra.

F=a=>{
  P=(s,l=s.length,r=l<2,j=1)=>{
    for(;!r&&j<l;j++)s.indexOf(x=s.slice(0,j),1)+j-l||(r=P(x));
      return r
  };      
  for(o={'':l=i=0};a[i+l]||a[i=0,++l];)
    if(P(p=a.slice(i++,i+l)))
      o[p]=0;
  return[a for(a in o)]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.