আমাদের একটি স্ট্রিং s আছে। আমাদের যাচাই করতে হবে যে s-কে তিনটি প্যালিনড্রোমিক সাবস্ট্রিংয়ে ভাগ করা যায় কিনা।
উদাহরণস্বরূপ, ইনপুট s = "levelpopracecar" হলে আউটপুট হবে True কারণ এটিকে "level", "pop", "racecar"-এ ভাগ করা যায়, সবগুলো প্যালিনড্রোম।
সমাধানের ধাপসমূহ (DP)
n := s-এর আকারdp := n x nআকারের ম্যাট্রিক্সFalseদিয়ে ফিল করেi=n-1থেকে ০ পর্যন্ত ১ কমানো হারে লুপ চালান:j= 0 থেকেn-1পর্যন্ত লুপ চালান:যদি
i >= jহয়, তবেdp[i][j] := Trueঅন্যথায়, যদি
s[i] == s[j]হয়, তবেdp[i][j] := dp[i+1][j-1]
i= 1 থেকেn-1পর্যন্ত লুপ চালান:j=i+1থেকেn-1পর্যন্ত লুপ চালান:যদি
dp[0][i-1]এবংdp[i][j-1]এবংdp[j][n-1]সবগুলোTrueহয়, তবেTrueরিটার্ন করুন
Falseরিটার্ন করুন
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালোভাবে বুঝার জন্য:
def solve(s):
n = len(s)
dp = [[False] * n for _ in range(n)]
for i in range(n-1, -1, -1):
for j in range(n):
if i >= j:
dp[i][j] = True
elif s[i] == s[j]:
dp[i][j] = dp[i+1][j-1]
for i in range(1, n):
for j in range(i+1, n):
if dp[0][i-1] and dp[i][j-1] and dp[j][n-1]:
return True
return False
s = "levelpopracecar"
print(solve(s)) ইনপুট
"levelpopracecar"
আউটপুট
True