मान लीजिए कि हमारे पास ASCII वर्णों के साथ एक स्ट्रिंग है, हमें इसके सभी अलग-अलग निरंतर पैलिंड्रोमिक सबस्ट्रिंग खोजने होंगे।
इसलिए, यदि इनपुट "bddaaa" जैसा है, तो आउटपुट [a, aa, aaa, b, d, dd]
होगा।इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- m :=एक नया नक्शा
- n :=आकार का
- मैट्रिक्स :=n संख्या 0s की दो पंक्तियाँ बनाएं
- s :="@" concatenate s concatenate "#"
- जे के लिए 0 से 1 की सीमा में, करें
- अस्थायी:=0
- मैट्रिक्स[जे, 0] :=0
- मैं :=1
- जबकि मैं <=n, करते हैं
- जबकि s[i - temp - 1] s[i + j + temp] के समान है, do
- अस्थायी:=अस्थायी + 1
- मैट्रिक्स[जे, आई] :=अस्थायी
- k :=1
- जबकि (मैट्रिक्स[j, i - k] अस्थायी - k के समान नहीं है) और k
- मैट्रिक्स[j,i+k] :=न्यूनतम मैट्रिक्स[j, i-k]
- k :=k + 1
- जबकि s[i - temp - 1] s[i + j + temp] के समान है, do
- अस्थायी:=अधिकतम तापमान - k, 0
- i :=i + k
- जे के लिए 0 से 1 की सीमा में, करें
- टेम्परेचर रेंज के लिए, करें
- m[(i - temp-1) से (i - temp - 1 + 2 * temp + j)] =1 से s का सबस्ट्रिंग
-
- टेम्परेचर रेंज के लिए, करें
- m[s[i]] :=1
- डिस्प्ले i
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
def find_substr(s):
m = dict()
n = len(s)
matrix = [[0 for x in range(n+1)] for x in range(2)]
s = "@" + s + "#"
for j in range(2):
temp = 0
matrix[j][0] = 0
i = 1
while i <= n:
while s[i - temp - 1] == s[i + j + temp]:
temp += 1
matrix[j][i] = temp
k = 1
while (matrix[j][i - k] != temp - k) and (k < temp):
matrix[j][i+k] = min(matrix[j][i-k], temp - k)
k += 1
temp = max(temp - k, 0)
i += k
s = s[1:len(s)-1]
m[s[0]] = 1
for i in range(1,n):
for j in range(2):
for temp in range(matrix[j][i],0,-1):
m[s[i - temp - 1 : i - temp - 1 + 2 * temp + j]] = 1
m[s[i]] = 1
for i in m:
print (i)
find_substr("bddaaa") इनपुट
bddaaa
आउटपुट
a aa b aaa d dd