मान लीजिए हमारे पास words नामक स्ट्रिंग की सूची है, जहां सभी एलिमेंट समान लंबाई के हैं। हमारे पास target नामक एक स्ट्रिंग भी है। हमें दिए गए शब्दों का उपयोग करके टारगेट जनरेट करना है निम्नलिखित नियमों के तहत:
- हमें टारगेट को बाएं से दाएं जनरेट करना चाहिए।
- टारगेट के i-वें कैरेक्टर (0-इंडेक्स्ड) को प्राप्त करने के लिए, हम
wordsमें j-वें स्ट्रिंग के k-वें कैरेक्टर का चयन कर सकते हैं जबtarget[i] == words[j][k]। - एक बार जब हम
wordsमें j-वें स्ट्रिंग के k-वें कैरेक्टर का उपयोग करते हैं, तो हमwordsमें किसी भी स्ट्रिंग के x-वें कैरेक्टर का उपयोग नहीं कर सकते जहांx <= k। - पूरे टारगेट स्ट्रिंग को बनाने तक इस प्रक्रिया को दोहराएं।
तो हमें words से टारगेट प्राप्त करने के तरीकों की संख्या ढूंढनी है। उत्तर बहुत बड़ा हो सकता है, इसलिए उत्तर को 10^9 + 7 मॉड्यूलो वापस करें।
उदाहरण के लिए, यदि इनपुट words = ["pqqp","qppq"], target = "qpq" है, तो आउटपुट 4 होगा क्योंकि:
"qpq" -> इंडेक्स 0 ("qppq"), इंडेक्स 1 ("qppq"), इंडेक्स 2 ("pqqp")"qpq" -> इंडेक्स 0 ("qppq"), इंडेक्स 1 ("qppq"), इंडेक्स 3 ("qppq")"qpq" -> इंडेक्स 0 ("qppq"), इंडेक्स 2 ("qppq"), इंडेक्स 3 ("qppq")"qpq" -> इंडेक्स 1 ("pqqp"), इंडेक्स 2 ("qppq"), इंडेक्स 3 ("qppq")
हल करने के चरण
m := wordsकी संख्याn := targetका आकारd :=आकारmकी सूची,mअलग-अलग खाली मैप से भरीwordsमें प्रत्येकwके लिए:wमें प्रत्येक इंडेक्सjऔर शब्दcके लिए:d[j][c] := d[j][c] + 1
dfs()फ़ंक्शन परिभाषित करें। यहi, jलेगा:- यदि
i == n, तो1वापस करें। - यदि
j == m, तो0वापस करें। (dfs(i, j+1) + dfs(i+1, j+1) * d[j][target[i]]) % (10^9 + 7)वापस करें।
- यदि
- मुख्य मेथड से
dfs(0, 0)वापस करें।
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
from collections import Counter
def solve(words, target):
m, n = len(words[0]), len(target)
d = [Counter() for _ in range(m)]
for w in words:
for j, c in enumerate(w):
d[j][c] += 1
def dfs(i, j):
if i == n:
return 1
if j == m:
return 0
return (dfs(i, j+1) + dfs(i+1, j+1) * d[j][target[i]]) % int(1e9 + 7)
return dfs(0, 0)
words = ["pqqp","qppq"]
target = "qpq"
print(solve(words, target))
इनपुट
["pqqp","qppq"], "qpq"
आउटपुट
4