Lesson 5 � Intermediate

DP on Strings & Grids

Strings aur grids pe DP bahut common hai interviews mein. Strings mein Palindrome checking, String Encoding, Word Break � ye sab DP se solve hote hain. Grids mein Unique Paths, Minimum Path Sum, Dungeon Game � 2D DP ka sabse accha example. Is lesson mein hum dono types dekhenge � 1D string DP aur 2D grid DP.

? 30 min✓ Intermediate✓ LIS, LCS

Palindrome Check (DP)

String palindrome hai ya nahi � DP se O(n^2) mein check karte hain. Longer substrings ke liye shorter substrings ka result use hota hai:

# Longest Palindromic Substring � DP approach
def longestPalindrome(s):
 n = len(s)
 dp = [[False] * n for _ in range(n)]
 start, max_len = 0, 1
 
 # Single characters are palindromes
 for i in range(n):
 dp[i][i] = True
 
 # Check for length 2
 for i in range(n - 1):
 if s[i] == s[i + 1]:
 dp[i][i + 1] = True
 start, max_len = i, 2
 
 # Check for length 3+
 for length in range(3, n + 1):
 for i in range(n - length + 1):
 j = i + length - 1
 if s[i] == s[j] and dp[i + 1][j - 1]:
 dp[i][j] = True
 if length > max_len:
 start, max_len = i, length
 
 return s[start:start + max_len]

# Example
s = "babad"
print(f"Longest Palindrome: {longestPalindrome(s)}") # "bab" ya "aba"
Palindrome DP Logic: dp[i][j] = True agar s[i] == s[j] AND dp[i+1][j-1] = True. Chhote palindromes se bade palindromes ban rahe hain � bottom-up approach.

Word Break Problem

String ko dictionary ke words mein break kar sakte ho✓ DP se check karo � har position pe "kya yahan tak break possible hai":

# Word Break � kya string ko words mein break kar sakte ho?
def wordBreak(s, wordDict):
 n = len(s)
 dp = [False] * (n + 1)
 dp[0] = True # Empty string always breakable
 
 for i in range(1, n + 1):
 for word in wordDict:
 if len(word) <= i and s[i - len(word):i] == word:
 if dp[i - len(word)]:
 dp[i] = True
 break
 
 return dp[n]

# Example
s = "leetcode"
wordDict = ["leet", "code"]
print(f"Word Break possible: {wordBreak(s, wordDict)}") # True

# DP Table:
# s = "leetcode"
# dp[0] = True (empty)
# dp[4] = True ("leet" mila, dp[0] True)
# dp[8] = True ("code" mila, dp[4] True)

Unique Paths in Grid

m x n grid mein top-left se bottom-right jaana hai � sirf right ya down ja sakte ho. Kitne unique paths hain?

# Unique Paths � m x n grid
def uniquePaths(m, n):
 dp = [[1] * n for _ in range(m)]
 for i in range(1, m):
 for j in range(1, n):
 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
 return dp[m - 1][n - 1]

# Grid Visualization (3x3):
# 1 1 1
# 1 2 3
# 1 3 6
#
# dp[0][*] = 1 (sirf right ja sakte ho)
# dp[*][0] = 1 (sirf down ja sakte ho)
# dp[i][j] = upar se aao + baayan se aao

Grid DP Visualization

# Grid Path Finding � 4x5 grid
#
# Col: 0 1 2 3 4
# Row:
# 0 1 1 1 1 1
# 1 1 2 3 4 5
# 2 1 3 6 10 15
# 3 1 4 10 20 35
#
# Har cell = upar ka + baayan ka
# dp[i][j] = dp[i-1][j] + dp[i][j-1]
#
# Path example: (0,0) ? (0,1) ? (1,1) ? (1,2) ? (2,2) ? (2,3) ? (2,4)
# Right, Down, Right, Down, Right, Down = 6 steps total

Minimum Path Sum

Grid mein har cell ka cost hai � minimum cost path dhundho top-left se bottom-right:

# Minimum Path Sum
def minPathSum(grid):
 m, n = len(grid), len(grid[0])
 dp = [[0] * n for _ in range(m)]
 dp[0][0] = grid[0][0]
 
 # First row � sirf baayan se aa sakte ho
 for j in range(1, n):
 dp[0][j] = dp[0][j - 1] + grid[0][j]
 
 # First column � sirf upar se aa sakte ho
 for i in range(1, m):
 dp[i][0] = dp[i - 1][0] + grid[i][0]
 
 # Baaki cells � min(upar, baayan) + current cost
 for i in range(1, m):
 for j in range(1, n):
 dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
 
 return dp[m - 1][n - 1]

# Example
grid = [
 [1, 3, 1],
 [1, 5, 1],
 [4, 2, 1]
]
print(f"Minimum Path Sum: {minPathSum(grid)}") # 7 (1?3?1?1?1)

Try it: code khud likho

Exercise

Question: 2x2 grid mein kitne unique paths hain top-left se bottom-right✓ Sirf number daalo.

Question: Word Break problem mein dp[i] kya represent karta hai✓ Ek line mein batao.

Common mistakes

Lesson complete?

Strings aur Grids pe DP samajh aa gaya✓ Ab top 10 DP problems dekhte hain jo interview mein sabse zyada aati hain � inko solve karna seekh lo!