कोडिंग साक्षात्कार की तैयारी · पाठ

Decode Ways और पथों की गिनती

decode-ways को Fibonacci-जैसे DP के रूप में हल कीजिए, जिसमें अंकों से अक्षरों का मानचित्रण होता है, फिर परिवर्तनीय चरण-आकार वाली सीढ़ी में पथ गिनिए।

पाठ 4, कुल 4 में से13 चरण

Decode Ways और पथों की गिनती, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

डिकोड वेज़ की समस्या

डिकोड वेज़ (LeetCode 91) अंकों वाली स्ट्रिंग को अक्षरों में बदलता है: 'A'=1, 'B'=2, ..., 'Z'=26। एक एन्कोड की गई अंकों की स्ट्रिंग दिए जाने पर उसे डिकोड करने के अलग-अलग तरीकों की संख्या गिनिए। उदाहरण के लिए, '12' को 'AB' (1+2) या 'L' (12) के रूप में डिकोड किया जा सकता है, इसलिए 2 तरीके हैं। '226' को 'BZ' (2+26), 'VF' (22+6) या 'BBF' (2+2+6) के रूप में डिकोड किया जा सकता है, इसलिए 3 तरीके हैं। आरंभिक शून्य कुछ डिकोडिंग को अमान्य बना देते हैं।

# Encoding: A=1, B=2, ..., Z=26
# '12' → 'AB' or 'L' → 2 ways
# '226' → 'BZ' or 'VF' or 'BBF' → 3 ways
# '06' → invalid (no letter for '0')
# '10' → 'J' only → 1 way (only valid as 10, not 1+0)

s = '226'
print('Decodings for', s, ':', 3)  # Expected: 3

डिकोड करने के तरीकों का DP सूत्रीकरण

मान लें कि dp[i] = s[:i] को डिकोड करने के तरीकों की संख्या। आधार स्थितियाँ: dp[0] = 1 (खाली स्ट्रिंग, एक तरीका), और dp[1] = 1 यदि s[0] != '0', अन्यथा 0। संक्रमण: यदि s[i-1] != '0', तो dp[i-1] जोड़ें (एक-अंकीय डिकोडिंग)। यदि 10 ≤ int(s[i-2:i]) ≤ 26, तो dp[i-2] जोड़ें (दो-अंकीय डिकोडिंग)। यह मूलतः वैधता जाँचों के साथ फिबोनाची पैटर्न है।

def num_decodings(s):
    n = len(s)
    dp = [0] * (n + 1)
    dp[0] = 1  # empty prefix
    dp[1] = 0 if s[0] == '0' else 1
    
    for i in range(2, n + 1):
        # Single digit decode
        if s[i-1] != '0':
            dp[i] += dp[i-1]
        # Two digit decode
        two_digit = int(s[i-2:i])
        if 10 <= two_digit <= 26:
            dp[i] += dp[i-2]
    return dp[n]

print(num_decodings('12'))   # 2
print(num_decodings('226'))  # 3
print(num_decodings('06'))   # 0

शुरुआती शून्य का जाल

डिकोड करने के तरीकों में सबसे पेचीदा हिस्सा शून्यों को सँभालना है। एक अकेले '0' को डिकोड नहीं किया जा सकता (कोई अक्षर 0 से संबद्ध नहीं है), इसलिए यदि s[i-1] == '0' हो, तो dp[i-1] न जोड़ें। दूसरे अंक के रूप में '0' तभी मान्य है जब दो-अंकीय संख्या 10 या 20 हो। '30' या '40' (और इससे बड़ी संख्याएँ) अमान्य हैं, क्योंकि वे 26 से अधिक हैं। हमेशा 10 ≤ two_digit ≤ 26 जाँचें, केवल two_digit ≤ 26 नहीं।

def num_decodings(s):
    if not s or s[0] == '0': return 0
    n = len(s)
    dp = [0] * (n + 1)
    dp[0] = 1
    dp[1] = 1  # s[0] != '0' guaranteed by guard above
    for i in range(2, n + 1):
        one = int(s[i-1])
        two = int(s[i-2:i])
        if one != 0: dp[i] += dp[i-1]  # valid single digit
        if 10 <= two <= 26: dp[i] += dp[i-2]  # valid two digits
    return dp[n]

print(num_decodings('10'))   # 1 (only 'J')
print(num_decodings('30'))   # 0 (30 > 26, '0' alone invalid)
print(num_decodings('100'))  # 0 (dp[2]=1 then '00' invalid, single '0' invalid)

मेमोरी का बेहतर उपयोग करके डिकोड करने के तरीके

फिबोनाची की तरह, डिकोड करने के तरीकों की पुनरावृत्ति केवल दो पिछली स्थितियों को देखती है, इसलिए आप दो चरों का उपयोग करके O(n) मेमोरी को O(1) तक घटा सकते हैं। prev2 (दो कदम पीछे) और prev1 (एक कदम पीछे) का उपयोग करें। हर चरण में दोनों से curr की गणना करें, फिर मानों को आगे खिसकाएँ। यह फिबोनाची को दो-चर वाले अनुकूलन में बदलने के समान ही है।

def num_decodings_o1(s):
    if not s or s[0] == '0': return 0
    prev2 = 1  # dp[0]
    prev1 = 1  # dp[1]
    for i in range(2, len(s) + 1):
        curr = 0
        if s[i-1] != '0':
            curr += prev1
        two = int(s[i-2:i])
        if 10 <= two <= 26:
            curr += prev2
        prev2, prev1 = prev1, curr
    return prev1

print(num_decodings_o1('226'))   # 3
print(num_decodings_o1('12'))    # 2
print(num_decodings_o1('0'))     # 0

सीढ़ियों पर पथों की गिनती

सीढ़ियाँ चढ़ना (LeetCode 70) पूछता है: यदि आप एक बार में 1 या 2 सीढ़ियाँ चढ़ सकते हैं, तो n सीढ़ियाँ चढ़ने के कितने तरीके हैं? यह बिल्कुल फिबोनाची अनुक्रम है: ways(n) = ways(n-1) + ways(n-2)। ways(1)=1, ways(2)=2, ways(3)=3, ways(4)=5। जब आप अधिकतम k सीढ़ियाँ चढ़ सकते हैं, तब इसे सामान्यीकृत किया जाता है: ways(n) = sum(ways(n-1), ..., ways(n-k))।

def climb_stairs(n):
    if n <= 2: return n
    prev2, prev1 = 1, 2
    for _ in range(3, n + 1):
        prev2, prev1 = prev1, prev1 + prev2
    return prev1

for i in range(1, 8):
    print(f'climb_stairs({i}) = {climb_stairs(i)}')
# 1, 2, 3, 5, 8, 13, 21 — Fibonacci!

अलग-अलग चरणों के साथ सीढ़ियाँ चढ़ना

जब आप दिए गए समुच्चय से किसी भी संख्या में सीढ़ियाँ चढ़ सकते हैं (जैसे, {1, 3, 5}), तो पुनरावृत्ति dp[i] = sum(dp[i-k] for k in steps if i-k >= 0) बन जाती है। मेमोरी की दक्षता के लिए max(steps) आकार की चलती विंडो का उपयोग करें। यह असीमित थैला गिनती का रूपांतर है — प्रत्येक चरण-आकार का कितनी भी बार उपयोग किया जा सकता है।

def count_ways(n, steps):
    dp = [0] * (n + 1)
    dp[0] = 1  # one way to stay at ground
    for i in range(1, n + 1):
        for step in steps:
            if i >= step:
                dp[i] += dp[i - step]
    return dp[n]

# Steps of 1 or 2 (classic climbing stairs)
print(count_ways(5, [1, 2]))    # 8
# Steps of 1, 3, or 5
print(count_ways(5, [1, 3, 5])) # 5
# Steps of 2 or 3
print(count_ways(6, [2, 3]))    # 3 (2+2+2, 3+3, 2+4-invalid, 2+2+2, 3+3, 3+2+1-no...)

सीढ़ियाँ चढ़ने की न्यूनतम लागत

न्यूनतम लागत में सीढ़ियाँ चढ़ना (LeetCode 746) प्रत्येक सीढ़ी के साथ एक लागत जोड़ता है और शीर्ष तक पहुँचने की न्यूनतम लागत पूछता है। सीढ़ी i से आप i+1 या i+2 पर जा सकते हैं। पुनरावृत्ति है: dp[i] = cost[i] + min(dp[i-1], dp[i-2])। आप सीढ़ी 0 या सीढ़ी 1 से शुरू कर सकते हैं। उत्तर min(dp[n-1], dp[n-2]) है।

def min_cost_climbing(cost):
    n = len(cost)
    if n == 1: return cost[0]
    dp = [0] * n
    dp[0] = cost[0]
    dp[1] = cost[1]
    for i in range(2, n):
        dp[i] = cost[i] + min(dp[i-1], dp[i-2])
    return min(dp[-1], dp[-2])  # can start from step 0 or 1

print(min_cost_climbing([10, 15, 20]))      # 15
print(min_cost_climbing([1, 100, 1, 1, 1, 100, 1, 1, 100, 1]))  # 6

डिकोड करने के तरीके II: वाइल्डकार्ड अंक

डिकोड करने के तरीके II (LeetCode 639) में वाइल्डकार्ड वर्ण '*' जोड़ा गया है, जो 1-9 में से किसी भी अंक का प्रतिनिधित्व कर सकता है। इससे मान्य डिकोडिंग की संख्या बहुत बढ़ जाती है। अकेला '*' 9 तरीके देता है (1-9 में से किसी भी अंक के रूप में)। दो '*' मिलकर 9×9 दो-अंकीय संयोजन बना सकते हैं, लेकिन केवल 26 या उससे कम वाले संयोजन मान्य हैं (11-19 = 9 तरीके, 21-26 = 6 तरीके → '**' के लिए 15 तरीके)। स्थितियों का सावधानीपूर्वक विश्लेषण आवश्यक है।

def num_decodings_ii(s):
    MOD = 10**9 + 7
    prev2, prev1 = 1, 9 if s[0] == '*' else (0 if s[0] == '0' else 1)
    for i in range(1, len(s)):
        curr = 0
        c, p = s[i], s[i-1]
        # Single digit
        if c == '*': curr += 9 * prev1
        elif c != '0': curr += prev1
        # Two digits
        if p == '*' and c == '*': curr += 15 * prev2  # 11-19(9) + 21-26(6)
        elif p == '*': curr += (2 if c <= '6' else 1) * prev2
        elif c == '*': curr += (9 if p == '1' else (6 if p == '2' else 0)) * prev2
        else:
            two = int(p + c)
            if 10 <= two <= 26: curr += prev2
        prev2, prev1 = prev1, curr % MOD
    return prev1 % MOD

print(num_decodings_ii('*'))   # 9
print(num_decodings_ii('1*'))  # 18

फिबोनाची संबंध

डिकोड करने के तरीके और सीढ़ियाँ चढ़ना, दोनों छिपे हुए फिबोनाची-परिवार की समस्याएँ हैं। कोई भी DP जिसमें dp[i] केवल dp[i-1] और dp[i-2] पर निर्भर हो, फिबोनाची जैसी संरचना वाला होता है और O(1) मेमोरी में हल किया जा सकता है। वैधता जाँचें (शून्य अंक, चरण-आकार) यह बदलती हैं कि कौन-से संक्रमण सक्रिय हैं, लेकिन दो पिछली स्थितियों पर निर्भर मूल संरचना नहीं बदलती। साक्षात्कारों में इस परिवार को तुरंत पहचानना तेज़ी के लिए एक उपयोगी पैटर्न है।

# Fibonacci family: dp[i] = f(dp[i-1], dp[i-2])
# Fibonacci itself:        dp[i] = dp[i-1] + dp[i-2]
# Climbing stairs:         dp[i] = dp[i-1] + dp[i-2]
# Decode ways:             dp[i] = (dp[i-1] if one_valid) + (dp[i-2] if two_valid)
# Min cost stairs:         dp[i] = cost[i] + min(dp[i-1], dp[i-2])
# House robber:            dp[i] = max(dp[i-1], nums[i] + dp[i-2])

# All solved with 2 rolling variables:
prev2, prev1 = 0, 1
for _ in range(10):
    prev2, prev1 = prev1, prev1 + prev2
print('Fibonacci F(10):', prev1)  # 89

ग्रिड पर पथों की गिनती

एक संबंधित गिनती की समस्या पर विचार करें: m×n ग्रिड दिया गया है; यदि आप केवल दाएँ या नीचे जा सकते हैं, तो ऊपरी-बाएँ से निचले-दाएँ तक जाने वाले कितने अद्वितीय पथ हैं? उत्तर द्विपद गुणांक C(m+n-2, m-1) है। DP समाधान में 2D तालिका भरी जाती है, जहाँ dp[i][j] = dp[i-1][j] + dp[i][j-1]। यह फिबोनाची सीढ़ी का 2D रूप है — प्रत्येक सेल ऊपर और बाईं ओर वाले सेल का योग होता है।

def unique_paths(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]

# Or use math for O(1) solution
import math
def unique_paths_math(m, n):
    return math.comb(m + n - 2, m - 1)

print(unique_paths(3, 7))         # 28
print(unique_paths_math(3, 7))    # 28
print(unique_paths(3, 3))         # 6

साक्षात्कार की सामान्य भूलों का सारांश

डिकोड करने के तरीकों में सामान्य भूलें: (1) यह भूल जाना कि अकेला '0' अमान्य है — dp[i-1] जोड़ने से पहले हमेशा s[i-1] != '0' जाँचें। (2) two_digit <= 26 का उपयोग करके two_digit >= 10 जाँचना भूल जाना — '07' को 'G' के रूप में डिकोड नहीं किया जाना चाहिए। (3) dp[n] के बजाय dp[n-1] लौटाना — तालिका 1-आधारित है, इसलिए dp[n] पूरी स्ट्रिंग से संबंधित है। जब आपकी DP तालिका में इनपुट से एक तत्व अधिक हो, तो सारणी के सूचकांकों की हमेशा दोबारा जाँच करें।

# Common bug: checking two_digit <= 26 without >= 10
def buggy_decode(s):
    dp = [0] * (len(s) + 1)
    dp[0] = dp[1] = 1
    for i in range(2, len(s) + 1):
        if s[i-1] != '0': dp[i] += dp[i-1]
        two = int(s[i-2:i])
        # BUG: '07' gives two=7, and 7 <= 26 would add dp[i-2]
        # Fix: require two >= 10
        if 10 <= two <= 26: dp[i] += dp[i-2]  # CORRECT
    return dp[len(s)]

print(buggy_decode('06'))   # 0 (correct, '0' alone invalid)
print(buggy_decode('07'))   # 0 (correct, '07' not valid, '0' alone invalid)
print(buggy_decode('27'))   # 1 (only 'BG', 27>26 so no two-digit)

त्वरित जाँच

इस पाठ में डेटा संरचनाएँ और एल्गोरिदम — कोडिंग साक्षात्कार की तैयारी संबंधी अवधारणाओं की अपनी समझ का परीक्षण कीजिए।

पाठ का पुनरावलोकन

इस पाठ में आपने सीखा: डिकोड करने के तरीके एक-अंकीय (गैर-शून्य) और दो-अंकीय (10-26) डिकोडिंग के लिए वैधता-शर्तों वाली फिबोनाची-जैसी पुनरावृत्ति का पालन करते हैं, सीढ़ियाँ चढ़ना और न्यूनतम लागत वाली सीढ़ियाँ शुद्ध फिबोनाची रूपांतर हैं जिन्हें O(1) मेमोरी में हल किया जा सकता है, और दो पिछली स्थितियों पर निर्भर फिबोनाची परिवार को पहचानने से साक्षात्कारों के दौरान पर्याप्त समय बचता है। आगे हम दो अनुक्रमों पर 2D DP का उपयोग करके सबसे लंबे साझा उपअनुक्रम का अध्ययन करेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
90
पाठ
360

अक्सर पूछे जाने वाले प्रश्न

क्या “Decode Ways और पथों की गिनती” पाठ निःशुल्क है?

हाँ—“Decode Ways और पथों की गिनती” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Decode Ways और पथों की गिनती” में मैं क्या सीखूँगा?

decode-ways को Fibonacci-जैसे DP के रूप में हल कीजिए, जिसमें अंकों से अक्षरों का मानचित्रण होता है, फिर परिवर्तनीय चरण-आकार वाली सीढ़ी में पथ गिनिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Decode Ways और पथों की गिनती” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. House Robber: लेना या छोड़ना पुनरावृत्ति
  2. अधिकतम उपऐरे और अधिकतम गुणनफल उपऐरे
  3. Word Break और स्ट्रिंग विभाजन
  4. Decode Ways और पथों की गिनती
← कोडिंग साक्षात्कार की तैयारी पर वापस जाएँ