สมมติว่าเราได้รับจำนวนสตริงจำนวน n; str1, str2, str3,.....,strn. ทีนี้ สมมติว่า substri เป็นเซตที่มี substring ทั้งหมดของ stri ยูเนียนของเซตย่อยทั้งหมดคือ substr_union ตอนนี้เราได้รับจำนวนการสืบค้น q และเราต้องหาองค์ประกอบที่ q-th ของชุด substr_union ชุด substr_union ถูกจัดเรียงตามพจนานุกรมและดัชนีเริ่มต้นจาก 1
ดังนั้น หากอินพุตเหมือนกับรายการสตริงคือ =['pqr', 'pqt'] เคียวรีคือ =[4, 7, 9] ผลลัพธ์จะเป็น ['pqt', 'qt', 't' ]
สตริงย่อยจากสตริงแรกคือ subs_str_1 ={p, pq, pqr, q, qr, r }, sub_str_2 ={p, pq, pqt, q, qt, t}.
ยูเนี่ยนของสองชุดนี้หรือ substr_union คือ {p, pq, pqr, pqt, q, qr, qt, r, t}.
ดังนั้นรายการที่ดัชนี 4, 7 และ 9 คือ 'pqt', qt' และ 't' ตามลำดับ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน lng_i() นี้จะใช้เวลาพอ, lng, i
- d :=ทูเพิลใหม่ที่มี (suff, lng)
- หล่อ :=0
- สวัสดี :=0
- สำหรับแต่ละทูเพิล (suf, lng) ใน d ทำ
- ถ้า lng คล้ายกับ null แล้ว
- lng :=0
- hi :=hi + ขนาดของ suf - lng
- ถ้า hi - 1 เหมือนกับ i แล้ว
- ส่งคืน suf
- มิฉะนั้น เมื่อ hi - 1> i แล้ว
- สำหรับดัชนี p และรายการ q ในรายการค่าตั้งแต่ lng ถึงขนาดของ suf ให้ทำ
- ถ้า lo + p เหมือนกับ i แล้ว
- คืนค่า suf[จากดัชนี 0 ถึง j+1]
- ถ้า lo + p เหมือนกับ i แล้ว
- สำหรับดัชนี p และรายการ q ในรายการค่าตั้งแต่ lng ถึงขนาดของ suf ให้ทำ
- หล่อ :=สวัสดี
- ถ้า lng คล้ายกับ null แล้ว
- คืนค่าเท็จ
- กำหนดฟังก์ชัน hlp_ii() นี่จะใช้เวลา str1,str2
- ub :=ขนาดต่ำสุดของ str1 , ขนาดของ str2
- cnt :=0
- สำหรับผมในช่วง 0 ถึง ub ให้ทำ
- ถ้า str1[i] เหมือนกับ str2[i] แล้ว
- cnt :=cnt + 1
- มิฉะนั้น
- คืนสินค้า
- คืนสินค้า
- ถ้า str1[i] เหมือนกับ str2[i] แล้ว
- t_dict :=แผนที่ใหม่
- suff :=รายการใหม่
- lng :=รายการใหม่
- สำหรับแต่ละ str ในสตริง ทำ
-
สำหรับฉันในช่วง 0 ถึงขนาดของ str ทำ
- value :=str[จากดัชนี i ถึงจุดสิ้นสุด]
- หากไม่มีค่าใน t_dict แล้ว
- t_dict[value] :=1
- ใส่ค่าที่ส่วนท้ายของ suff
-
- จัดเรียงรายการต่อท้าย
- suff_len :=ขนาดของ suff
- สำหรับฉันในช่วง 0 ถึงขนาดของ suff_len ทำ
- ถ้าฉันเหมือนกับ 0 แล้ว
- ใส่ null ที่ส่วนท้ายของ lng
- มิฉะนั้น
- แทรก hlp_ii(suff[i-1], suff[i]) ต่อท้าย lng
- ถ้าฉันเหมือนกับ 0 แล้ว
- res :=รายการใหม่
- สำหรับแต่ละ q ใน q_list ทำ
- แทรก (lng_i(suff, lng, q-1)) ที่ส่วนท้ายของความละเอียด
- ผลตอบแทน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def lng_i(suff, lng, i):
d = zip(suff,lng)
lo = hi = 0
for suf, lng in d:
if lng is None:
lng = 0
hi += len(suf) - lng
if hi - 1 == i:
return suf
elif hi - 1 > i:
for p, q in enumerate(list(range(lng, len(suf)))):
if lo + p == i:
return suf[:q+1]
lo = hi
return False
def hlp_ii(str1,str2):
ub = min(len(str1), len(str2))
cnt = 0
for i in range(ub):
if str1[i] == str2[i]:
cnt += 1
else:
return cnt
return cnt
def solve(strings,q_list):
t_dict = {}
suff = []
lng = []
for str in strings:
for i in range(len(str)):
value = str[i:]
if value not in t_dict:
t_dict[value] = 1
suff.append(value)
suff.sort()
suff_len = len(suff)
for i in range(suff_len):
if i == 0:
lng.append(None)
else:
lng.append(hlp_ii(suff[i-1], suff[i]))
res = []
for q in q_list:
(res.append(lng_i(suff, lng, q-1)))
return res
print(solve(['pqr', 'pqt'], [4, 7, 9])) อินพุต
['pqr', 'pqt'], [4, 7, 9]
ผลลัพธ์
['pqt', 'qt', 't']