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.
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"
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
- Grid mein first row/column handle na karna: First row mein sirf right, first column mein sirf down. Inko initialize karna mat bhoolo � nahi toh index out of bound aayega.
- Palindrome mein length check miss karna:
dp[i+1][j-1]tabhi valid hai jab length >= 3. Length 2 ke liye sirfs[i] == s[j]check karo. - Word Break mein dictionary lookup: Har position pe saare words check karo. Optimized: words ko set mein daal lo O(1) lookup ke liye.
- 2D DP space waste karna: Unique Paths mein sirf current row aur previous row chahiye � 2D ki jagah 1D array use karo. Space O(n) ho jaayega.
- String slicing mein time waste: Python mein
s[i:j]O(j-i) time leta hai. Agar bahut baar slice karna ho toh pre-process karo ya different approach use karo.
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!