Phát hiện đảo chữ trong Chuỗi gốc


9

Cho hai chuỗi, chuỗi cha và chuỗi truy vấn tương ứng, nhiệm vụ của bạn là xác định số lần chuỗi truy vấn hoặc đảo chữ của chuỗi truy vấn ; xuất hiện trong chuỗi cha, trong một tìm kiếm phân biệt chữ hoa chữ thường.

Ví dụ về hành vi

Đầu vào 1

AdnBndAndBdaBn
dAn

Đầu ra 1

4

Giải thích Các chuỗi con được tô đậm dưới đây:

Quảng cáo BndAndBdaBn

AdnB ndA ndBdaBn

AdnBn dAn dBdaBn

AdnBnd BdaBn

Lưu ý tìm kiếm PHẢI phân biệt chữ hoa chữ thường cho tất cả các tìm kiếm.

Đầu vào 2

AbrAcadAbRa
cAda

Đầu ra 2

2

Điều này phải làm việc cho chỉ tiêu chuẩn ASCII. Đây là môn đánh gôn, vì vậy số lượng nhân vật ngắn nhất sẽ nhận được sự chấp thuận. Ngoài ra, vui lòng gửi một phiên bản không được đánh gôn của mã của bạn cùng với phiên bản được đánh gôn.


2
Trường hợp thử nghiệm quan trọng:abacacaba aac
Martin Ender

Chuỗi cha sẽ luôn dài hơn chuỗi truy vấn?
Trình tối ưu hóa

Oh điểm rất tốt! Có @Optimizer, chuỗi cha sẽ luôn dài hơn chuỗi truy vấn.
WallyWest

@WallyWest Còn trường hợp kiểm tra bổ sung thì sao? Có nên tính các lần xuất hiện chồng chéo của một hoán vị?
Martin Ender

1
Bạn có thể đưa ra một trường hợp thử nghiệm và giải pháp chính xác cho nhận xét gần đây nhất của bạn?
isaacg

Câu trả lời:


5

Bình thường, 11 10 byte

lfqSzST.:w

Golf 1 byte nhờ @Jakube.

Trình diễn.

Lấy chuỗi truy vấn, theo sau là chuỗi cha trên một dòng mới.

Ung dung:

z = input()
len(filter(lambda T: sorted(z) == sorted(T), substrings(input())

Lưu 1 byte, chỉ cần xóa ký tự cuối cùng của giải pháp của bạn ;-)
Jakube

@Jakube Oh, tất nhiên, điều đó thật tuyệt vời.
isaacg

3

CJam, 13 byte

le!lf{\/,(}:+

(12 byte, nếu cho phép chồng lấp)

l$_,lew:$\e=

Đầu vào như sau:

dAn
AdnBndAndBdaBn

I E

<query string>
<parent string>

Cảm ơn Dennis vì đã lưu 3 byte trong kịch bản chồng chéo

Dùng thử trực tuyến tại đây


1
Bạn có thể xử lý chồng lấp với cùng một số byte:ll1$,ew:$\$e=
Dennis

@Dennis Điều đó thật tuyệt. 12 byte:l$_,lew:$\e= Nhưng không chắc bây giờ điều này có hợp lệ không vì OP đã nói rằng không cho phép chồng lấp. Hãy để tôi xem nếu tôi có thể giảm cái hiện tại của tôi.
Trình tối ưu hóa

2

JavaScript ES6, 95 byte

f=(p,q,n=0,s=a=>[...a].sort().join(''))=>[...p].map((_,i)=>n+=s(p.substr(i,q.length))==s(q))&&n

Đây là một hàm có hai đối số như thế này : f(parent,query).

Nó đi qua tất cả các chuỗi con của chuỗi cha có độ dài của chuỗi truy vấn và sắp xếp chúng. Nếu chúng giống với chuỗi truy vấn được sắp xếp, nó sẽ tăngn . Sắp xếp chuỗi gây khó chịu vì nó phải được chuyển đổi thành một mảng, được sắp xếp và chuyển đổi trở lại thành một chuỗi. Mã xác nhận và thử nghiệm dưới đây.

var f = function(p, q) {
  var n = 0
  var s = function(a) {
    return a.split('').sort().join('')
  }
  
  p.split('').map(function(_, i) {
    n += s(p.substr(i, q.length)) == s(q)
  })
  return n
}

// testing code below
document.getElementById('go').onclick = function() {
  var parent = document.getElementById('parent').value,
    query = document.getElementById('query').value;
  document.getElementById('output').innerHTML = f(parent, query);
}
<label>Parent: <input id="parent" value="AdnBndAndBdaBn"/></label><br />
<label>Query:  <input id="query" value="dAn"/></label><br />
<button id="go">Go</button><br />
<samp id="output">&mdash;</samp> anagrams found


2

Haskell, 77 68 byte

import Data.List
p#s=sum[1|x<-tails p,sort s==sort(take(length s)x)]

Sử dụng:

*Main> "AdnBndAndBdaBn" # "dAn"
4
*Main> "AbrAcadAbRa" # "cAda"
2
*Main> "abacacaba"# "aac"
2

Cách thức hoạt động: chuỗi cha là p , chuỗi truy vấn là s.

tailstạo một danh sách tham số của nó với việc loại bỏ liên tiếp phần tử đầu tiên, vd tails "abcd" -> ["abcd","bcd","cd","d",""]. Đối với mọi phần tử xcủa danh sách này, hãy lấy 1nếu các nphần tử đầu tiên được sắp xếp (trong đó nđộ dài làs ) bằng với phần tử được sắp xếp s. Tính tổng 1s.

Chỉnh sửa: tailsthay vì đệ quy rõ ràng


2

Python, 61 byte

s=sorted
f=lambda a,b:a>''and(s(b)==s(a[:len(b)]))+f(a[1:],b)

Đây là một thuật toán đệ quy. Nó kiểm tra xem các ký tự ban đầu của chuỗi cha, sau khi được sắp xếp, có giống với chuỗi truy vấn, được sắp xếp không. Sau đó, nó đệ quy trên chuỗi cha với ký tự đầu tiên bị xóa. Nó chấm dứt khi chuỗi cha trống.


2

Con trăn 2, 76 70 byte

Hàm lambda này lặp lại so sánh từng chuỗi con được sắp xếp với chuỗi con đích. Các trận đấu được tính và trả lại.

lambda a,d:sum(sorted(d[n:n+len(a)])==sorted(a)for n in range(len(d)))

Mã không mã hóa:

f = lambda substr, text: sum(
    sorted(text[n:n+len(substr)]) == sorted(substr)
    for n in range(len(text))
    )

def test(tests):
    for t in tests.split():
        substr, text  = t.split(',')
        print t, f(substr, text)

tests = '''ba,abcba dAn,AdnBndAndBdaBn aac,abacacaba'''
test(tests)

và đầu ra thử nghiệm:

ba,abcba 2
dAn,AdnBndAndBdaBn 4
aac,abacacaba 2

NỀN TẢNG! Tôi chưa bao giờ thấy điều đó. Tôi sẽ chỉnh sửa và lưu một số byte. Cảm ơn Jakube.
Logic Knight

2

Python 2, 124 118 byte

Hãy thử nó ở đây

Đây là một chức năng lambda ẩn danh. Nó có thể vẫn có thể được chơi golf hơn nữa.

import re,itertools as i
lambda p,q:sum(len(re.findall('(?='+''.join(i)+')',p))for i in set(i.permutations(q,len(q))))

Ung dung:

from itertools import*
import re
def f(p,q):
    c=0
    for i in set(permutations(q,len(q))):
        c+=len(re.findall('(?='+''.join(i)+')',p))
    print c

không cần re, bạn chỉ có thể thực hiện chuỗi.count (chuỗi con) cho mỗi lần hoán vị
sirpercival 15/05/2015

2
@sirpercival Không, string.cound không tính các lần xuất hiện chồng chéo, như trong f('aaa','aa').
Jakube

à, gọi tốt quá tôi quên mất điều đó
sirpercival 15/05/2015

1
import re,itertools as itiết kiệm 6 ký tự. (Trước đây tôi chưa biết nó hoạt động.)
Randomra
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.