<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DSA Interview Prep on Software Engineering Learning Paths</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/</link><description>Recent content in DSA Interview Prep on Software Engineering Learning Paths</description><generator>Hugo</generator><language>en</language><atom:link href="https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/index.xml" rel="self" type="application/rss+xml"/><item><title>Arrays &amp; Strings</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/01-arrays-strings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/01-arrays-strings/</guid><description>&lt;h1 id="arrays--strings"&gt;Arrays &amp;amp; Strings&lt;a class="anchor" href="#arrays--strings"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Arrays and strings are the most common data structures in interviews. Mastering a handful of patterns covers the vast majority of problems.&lt;/p&gt;
&lt;h2 id="pattern-complexity-table"&gt;Pattern Complexity Table&lt;a class="anchor" href="#pattern-complexity-table"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;When to Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Two Pointers&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Sorted array, pair finding, partitioning&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sliding Window&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(k)&lt;/td&gt;
					&lt;td&gt;Subarray/substring with constraint&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Prefix Sums&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Range sum queries, subarray sum equals K&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kadane&amp;rsquo;s Algorithm&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Maximum subarray sum&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sort + Scan&lt;/td&gt;
					&lt;td&gt;O(n log n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;When order doesn&amp;rsquo;t matter, grouping&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="two-pointers"&gt;Two Pointers&lt;a class="anchor" href="#two-pointers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The two-pointer technique uses two indices that move toward each other (or in the same direction) to solve problems in a single pass.&lt;/p&gt;</description></item><item><title>Hashmaps &amp; Sets</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/02-hashmaps-sets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/02-hashmaps-sets/</guid><description>&lt;h1 id="hashmaps--sets"&gt;Hashmaps &amp;amp; Sets&lt;a class="anchor" href="#hashmaps--sets"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Hash-based structures provide O(1) average-case lookup, making them the first tool to reach for when you need to check existence, count frequencies, or group elements.&lt;/p&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;When to Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Frequency Counting&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(k)&lt;/td&gt;
					&lt;td&gt;Count occurrences, find duplicates, majority element&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Two-Sum (Complement)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Find pair summing to target (unsorted)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Anagram Detection&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)*&lt;/td&gt;
					&lt;td&gt;Compare character frequencies&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Grouping&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Group elements by shared property&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set Operations&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Intersection, union, difference&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;*O(1) space when alphabet is fixed (e.g., 26 lowercase letters).&lt;/p&gt;</description></item><item><title>Linked Lists</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/03-linked-lists/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/03-linked-lists/</guid><description>&lt;h1 id="linked-lists"&gt;Linked Lists&lt;a class="anchor" href="#linked-lists"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Linked list problems test pointer manipulation skills. The key insight: most solutions use combinations of just a few core techniques.&lt;/p&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;When to Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Fast/Slow Pointers&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Cycle detection, middle finding, nth from end&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Reversal&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Reverse whole list or sub-section&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Merge&lt;/td&gt;
					&lt;td&gt;O(n + m)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Combine sorted lists, interleave&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sentinel Node&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Simplify edge cases (empty list, head deletion)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Runner Technique&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(1)&lt;/td&gt;
					&lt;td&gt;Split list, reorder&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="node-definition"&gt;Node Definition&lt;a class="anchor" href="#node-definition"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="fastslow-pointers-floyds-tortoise-and-hare"&gt;Fast/Slow Pointers (Floyd&amp;rsquo;s Tortoise and Hare)&lt;a class="anchor" href="#fastslow-pointers-floyds-tortoise-and-hare"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two pointers move at different speeds. The fast pointer moves 2 steps for every 1 step of the slow pointer.&lt;/p&gt;</description></item><item><title>Stacks &amp; Queues</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/04-stacks-queues/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/04-stacks-queues/</guid><description>&lt;h1 id="stacks--queues"&gt;Stacks &amp;amp; Queues&lt;a class="anchor" href="#stacks--queues"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Stacks (LIFO) and queues (FIFO) appear in problems involving ordering, nesting, and level-by-level processing. The monotonic stack pattern alone covers a large class of interview questions.&lt;/p&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;When to Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Monotonic Stack&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Next greater/smaller element, histogram&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Valid Parentheses&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Matching brackets, nesting validation&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stack as History&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Undo operations, path simplification&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Queue with Max/Min&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Sliding window max/min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BFS with Queue&lt;/td&gt;
					&lt;td&gt;O(V+E)&lt;/td&gt;
					&lt;td&gt;O(V)&lt;/td&gt;
					&lt;td&gt;Shortest path, level-order traversal&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Deque Patterns&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(k)&lt;/td&gt;
					&lt;td&gt;Sliding window, double-ended access&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="monotonic-stack"&gt;Monotonic Stack&lt;a class="anchor" href="#monotonic-stack"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A stack that maintains elements in sorted order (increasing or decreasing). As you push elements, you pop anything that violates the monotonic property.&lt;/p&gt;</description></item><item><title>Trees</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/05-trees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/05-trees/</guid><description>&lt;h1 id="trees"&gt;Trees&lt;a class="anchor" href="#trees"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Trees are the most frequently tested data structure in interviews. Most tree problems reduce to choosing the right traversal order and deciding what information to pass up or down the recursion.&lt;/p&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;When to Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DFS (Recursive)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(h)&lt;/td&gt;
					&lt;td&gt;Most tree problems — default choice&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BFS (Level-order)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(w)&lt;/td&gt;
					&lt;td&gt;Level-by-level processing, shortest path&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BST Operations&lt;/td&gt;
					&lt;td&gt;O(h)&lt;/td&gt;
					&lt;td&gt;O(h)&lt;/td&gt;
					&lt;td&gt;Search, insert, delete, validate&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Construction&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Build tree from traversal arrays&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Path Problems&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;O(h)&lt;/td&gt;
					&lt;td&gt;Sum paths, max path, diameter&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;h = height (log n balanced, n worst case), w = max width&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Heaps &amp; Priority Queues</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/06-heaps-priority-queues/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/06-heaps-priority-queues/</guid><description>&lt;h1 id="heaps--priority-queues"&gt;Heaps &amp;amp; Priority Queues&lt;a class="anchor" href="#heaps--priority-queues"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A heap gives you O(1) access to the min (or max) element and O(log n) insertion/extraction. This makes it the right choice when you repeatedly need the &amp;ldquo;best&amp;rdquo; element from a dynamic collection.&lt;/p&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;When to Use&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Top-K Elements&lt;/td&gt;
					&lt;td&gt;O(n log k)&lt;/td&gt;
					&lt;td&gt;O(k)&lt;/td&gt;
					&lt;td&gt;K largest/smallest, K most frequent&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Merge K Sorted&lt;/td&gt;
					&lt;td&gt;O(N log k)&lt;/td&gt;
					&lt;td&gt;O(k)&lt;/td&gt;
					&lt;td&gt;Combine k sorted sources&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Two Heaps (Median)&lt;/td&gt;
					&lt;td&gt;O(n log n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Running median, stream statistics&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Heap + Lazy Delete&lt;/td&gt;
					&lt;td&gt;O(n log n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Sliding window median, delayed removal&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Task Scheduling&lt;/td&gt;
					&lt;td&gt;O(n log n)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Cooldown, interval scheduling&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;N = total elements, k = number of sources or size constraint&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Backtracking</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/07-backtracking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/07-backtracking/</guid><description>&lt;h1 id="backtracking"&gt;Backtracking&lt;a class="anchor" href="#backtracking"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Backtracking systematically explores all possible solutions by making choices, checking constraints, and undoing choices that lead to dead ends. It&amp;rsquo;s controlled brute force with pruning.&lt;/p&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Problem Type&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
					&lt;th&gt;Pruning Possible?&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Permutations&lt;/td&gt;
					&lt;td&gt;O(n!)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Yes (used elements)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Combinations&lt;/td&gt;
					&lt;td&gt;O(C(n,k))&lt;/td&gt;
					&lt;td&gt;O(k)&lt;/td&gt;
					&lt;td&gt;Yes (remaining count)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Subsets&lt;/td&gt;
					&lt;td&gt;O(2ⁿ)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Minimal&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Constraint Satisfaction&lt;/td&gt;
					&lt;td&gt;Varies&lt;/td&gt;
					&lt;td&gt;O(n²)&lt;/td&gt;
					&lt;td&gt;Yes (constraint checking)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;String Partitioning&lt;/td&gt;
					&lt;td&gt;O(n · 2ⁿ)&lt;/td&gt;
					&lt;td&gt;O(n)&lt;/td&gt;
					&lt;td&gt;Yes (validity check)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="the-backtracking-template"&gt;The Backtracking Template&lt;a class="anchor" href="#the-backtracking-template"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every backtracking problem follows this structure:&lt;/p&gt;</description></item><item><title>Binary Search — Advanced Patterns</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/08-binary-search-advanced/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/08-binary-search-advanced/</guid><description>&lt;h1 id="binary-search--advanced-patterns"&gt;Binary Search — Advanced Patterns&lt;a class="anchor" href="#binary-search--advanced-patterns"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Binary search goes far beyond sorted arrays. The key insight: whenever you can define a monotonic predicate over a search space, binary search applies. This unlocks solutions to capacity problems, optimisation tasks, and rotated-array puzzles.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pattern-summary"&gt;Pattern Summary&lt;a class="anchor" href="#pattern-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Pattern&lt;/th&gt;
					&lt;th&gt;Typical Problem&lt;/th&gt;
					&lt;th&gt;Search Space&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Classic sorted search&lt;/td&gt;
					&lt;td&gt;Find target in array&lt;/td&gt;
					&lt;td&gt;Array indices&lt;/td&gt;
					&lt;td&gt;O(log n)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bisect on answer&lt;/td&gt;
					&lt;td&gt;Minimum capacity to ship&lt;/td&gt;
					&lt;td&gt;Answer range [lo, hi]&lt;/td&gt;
					&lt;td&gt;O(n · log(answer range))&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rotated array&lt;/td&gt;
					&lt;td&gt;Search in rotated sorted array&lt;/td&gt;
					&lt;td&gt;Array indices&lt;/td&gt;
					&lt;td&gt;O(log n)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Minimise maximum&lt;/td&gt;
					&lt;td&gt;Split array into k subarrays&lt;/td&gt;
					&lt;td&gt;[max_element, total_sum]&lt;/td&gt;
					&lt;td&gt;O(n · log S)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;2D matrix search&lt;/td&gt;
					&lt;td&gt;Search row-sorted + col-sorted&lt;/td&gt;
					&lt;td&gt;Flattened index or staircase&lt;/td&gt;
					&lt;td&gt;O(log(m·n)) or O(m+n)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;First/last occurrence&lt;/td&gt;
					&lt;td&gt;Lower bound / upper bound&lt;/td&gt;
					&lt;td&gt;Array indices&lt;/td&gt;
					&lt;td&gt;O(log n)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="the-binary-search-template"&gt;The Binary Search Template&lt;a class="anchor" href="#the-binary-search-template"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most problems use one of two forms — find the &lt;strong&gt;leftmost&lt;/strong&gt; position where a condition becomes true:&lt;/p&gt;</description></item><item><title>Graphs</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/09-graphs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/09-graphs/</guid><description>&lt;h1 id="graphs"&gt;Graphs&lt;a class="anchor" href="#graphs"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Graph problems appear in ~20% of technical interviews. They combine traversal patterns with problem-specific insight — knowing BFS/DFS is necessary but not sufficient. This section covers the patterns that let you recognise and solve graph problems systematically.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="when-youre-looking-at-a-graph-problem"&gt;When You&amp;rsquo;re Looking at a Graph Problem&lt;a class="anchor" href="#when-youre-looking-at-a-graph-problem"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Not every graph problem looks like &amp;ldquo;given a graph.&amp;rdquo; Recognise the disguises:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Problem Description&lt;/th&gt;
					&lt;th&gt;Hidden Graph&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Find if there&amp;rsquo;s a path from A to B&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;BFS/DFS traversal&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Find the shortest route&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;BFS (unweighted) or Dijkstra (weighted)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Detect a cycle in dependencies&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Cycle detection (DFS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Order tasks given prerequisites&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Topological sort&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Group connected items&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Connected components (Union-Find or DFS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Can you colour/bipartite?&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;BFS/DFS 2-colouring&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Minimum cost to connect all nodes&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Minimum spanning tree&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="pattern-1-bfs--shortest-path-in-unweighted-graphs"&gt;Pattern 1: BFS — Shortest Path in Unweighted Graphs&lt;a class="anchor" href="#pattern-1-bfs--shortest-path-in-unweighted-graphs"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shortest_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popleft&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;neighbor&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;neighbor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# not reachable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Use BFS when:&lt;/strong&gt; shortest path in unweighted graph, level-order traversal, minimum steps/moves.&lt;/p&gt;</description></item><item><title>Dynamic Programming</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/10-dynamic-programming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/10-dynamic-programming/</guid><description>&lt;h1 id="dynamic-programming"&gt;Dynamic Programming&lt;a class="anchor" href="#dynamic-programming"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Dynamic programming (DP) is an optimisation technique for problems with &lt;strong&gt;overlapping subproblems&lt;/strong&gt; and &lt;strong&gt;optimal substructure&lt;/strong&gt;. It avoids redundant computation by storing results of subproblems. DP appears in ~25% of medium/hard interview problems.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="recognising-dp-problems"&gt;Recognising DP Problems&lt;a class="anchor" href="#recognising-dp-problems"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Signal&lt;/th&gt;
					&lt;th&gt;Example&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Find the minimum/maximum&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Minimum cost to reach target&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Count the number of ways&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Number of paths, combinations&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Is it possible to&amp;hellip;?&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Can you partition into equal subsets?&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;Find the longest/shortest&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;Longest increasing subsequence&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Choices at each step affect future options&lt;/td&gt;
					&lt;td&gt;Buy/sell stock, house robber&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Problem has recursive structure&lt;/td&gt;
					&lt;td&gt;Fibonacci, grid paths&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="the-two-approaches"&gt;The Two Approaches&lt;a class="anchor" href="#the-two-approaches"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="top-down-memoisation"&gt;Top-Down (Memoisation)&lt;a class="anchor" href="#top-down-memoisation"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Start from the original problem, recurse, cache results:&lt;/p&gt;</description></item><item><title>Tries &amp; Advanced Structures</title><link>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/11-tries-and-advanced-structures/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/dsa-interview-prep/11-tries-and-advanced-structures/</guid><description>&lt;h1 id="tries--advanced-structures"&gt;Tries &amp;amp; Advanced Structures&lt;a class="anchor" href="#tries--advanced-structures"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Specialised data structures that solve specific problem categories more efficiently than generic ones. Tries dominate prefix problems, segment trees handle range queries, and monotonic structures optimise sliding window patterns.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="trie-prefix-tree"&gt;Trie (Prefix Tree)&lt;a class="anchor" href="#trie-prefix-tree"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A tree where each node represents a character. Paths from root to nodes form prefixes; paths to marked nodes form complete words.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TrieNode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Trie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrieNode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TrieNode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;starts_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="complexity"&gt;Complexity&lt;a class="anchor" href="#complexity"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Operation&lt;/th&gt;
					&lt;th&gt;Time&lt;/th&gt;
					&lt;th&gt;Space&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Insert&lt;/td&gt;
					&lt;td&gt;O(m)&lt;/td&gt;
					&lt;td&gt;O(m) per word&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Search&lt;/td&gt;
					&lt;td&gt;O(m)&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Prefix check&lt;/td&gt;
					&lt;td&gt;O(m)&lt;/td&gt;
					&lt;td&gt;—&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Where m = word length.&lt;/p&gt;</description></item></channel></rss>