String Periodicity Check करना
हम Check करना चाहते हैं कि हमारे पास जो String है वह इस String के Substring की Repetitions से Composed है या नहीं। इसे Check करने के लिए हम Check कर सकते हैं कि String का कोई Rotation 2 Strings के Combination में Exist करता है या नहीं। ऐसा इसलिए क्योंकि एक String Periodic होती है यदि और केवल यदि यह स्वयं के Non-trivial Rotation के बराबर होती है।
उदाहरण
निम्न Code इसे Check करता है और Accordingly Return करता है:
def find_period(s):
# 2 s को Concatenate करें और s को इसके भीतर Find करें
# Index 1 से End of String तक
i = (s + s).find(s, 1, -1)
return None if i == -1 else s[:i]
print(find_period('012012012012012'))
print(find_period('some random string'))
Output:
012 None
How it Works:
- String को स्वयं के साथ Concatenate करें:
s + s - Original String
sको Concatenated String में Search करें, Index 1 से शुरू करके (Trivial Match at 0 को Avoid करने के लिए) - यदि Index
len(s) - 1से पहले मिलता है, तो String Periodic है - Period Length = Found Index
Alternative Approach (KMP Algorithm):
def find_period_kmp(s):
"""KMP Failure Function का उपयोग करके Period Find करें"""
n = len(s)
lps = [0] * n # Longest Prefix Suffix
# LPS Array Build करें
length = 0
i = 1
while i < n:
if s[i] == s[length]:
length += 1
lps[i] = length
i += 1
else:
if length != 0:
length = lps[length - 1]
else:
lps[i] = 0
i += 1
# Period Check
period = n - lps[-1]
if period != n and n % period == 0:
return s[:period]
return None
Test Cases:
test_cases = [
'012012012012012', # Periodic: '012'
'abcabcabc', # Periodic: 'abc'
'aaaaa', # Periodic: 'a'
'ababab', # Periodic: 'ab'
'abcdef', # Not Periodic
'some random string', # Not Periodic
'', # Empty
'a', # Single Char
]
for case in test_cases:
result = find_period(case)
print(f"'{case}' -> {result}")