Simplify Path - Stack - Leetcode 71 - Python

  Рет қаралды 62,814

NeetCode

NeetCode

Күн бұрын

Пікірлер: 56
@yaoyao6605
@yaoyao6605 3 жыл бұрын
It's really nice that you started by explaining how the directory works. Very clear and organize video!
@licokr
@licokr 8 ай бұрын
appending a slash at the end of path and appending a slash when it returns makes code much easier to implement. I added many conditions and it is not easy to read. I learned a lot today too. Thank you so much!
@danielsun716
@danielsun716 Жыл бұрын
So the built-in function .split() come up in my mind, which is a good way to convert string into list, this will help a lot. Let's still take Neetcode's example of the path. If path is "/../abc//./def/", then path.split('/') gonna be [' ', '..', 'abc', ' ', '.', 'def', ' ']. And this is pretty easy to understand the if conditions in Neetcode's code. class Solution: def simplifyPath(self, path: str) -> str: stack = [] newPath = path.split('/') for c in newPath: if c == '..': if stack: stack.pop() elif c != '' and c != '.': stack.append(c) return '/' + '/'.join(stack)
@anirudh1202
@anirudh1202 Жыл бұрын
This is a simpler solution
@DesiqnedBy
@DesiqnedBy 6 ай бұрын
This made the solution make alot more sense, thank you!
@edwardteach2
@edwardteach2 2 жыл бұрын
Leetcode's solution is also good to understand was well: class Solution: def simplifyPath(self, path: str) -> str: # Initialize a stack stack = [] # Split the input string on "/" as the delimiter # and process each portion one by one for portion in path.split("/"): # If the current component is a "..", then # we pop an entry from the stack if it's non-empty if portion == "..": if stack: stack.pop() elif portion == "." or not portion: # A no-op for a "." or an empty string continue else: # Finally, a legitimate directory name, so we add it # to our stack stack.append(portion) # Stich together all the directory names together final_str = "/" + "/".join(stack) return final_str
@dhruvpatel9708
@dhruvpatel9708 2 жыл бұрын
Personally I find leetcode solution more easy to understand
@ladydimitrescu1155
@ladydimitrescu1155 Жыл бұрын
Honestly this is much more straightforward, thanks!
@littletiger1228
@littletiger1228 5 ай бұрын
so much better
@pranavbhatia8736
@pranavbhatia8736 2 жыл бұрын
I tried something like this without having to create cur variable. There are 2 conditions - one for double dot in which case we pop from the stack if stack is not empty. The second case is for single dot - we append into our stack if dir is not equal to single dot. class Solution: def simplifyPath(self, path: str) -> str: stack = [] path = path.replace('//','/') for dir in path.split('/'): if dir: if dir == '..': if stack: stack.pop() else: if dir != '.': stack.append(dir) return '/' + '/'.join(stack) Submission stats: Runtime: 35 ms, faster than 84.95% of Python3 online submissions for Simplify Path. Memory Usage: 13.9 MB, less than 37.47% of Python3 online submissions for Simplify Path.
@kaneknight4606
@kaneknight4606 3 жыл бұрын
Hero. Your videos really help with confidence.
@NeetCode
@NeetCode 3 жыл бұрын
Thanks, appreciate the kind words 🙂
@oijgg3p
@oijgg3p 11 ай бұрын
@@NeetCode I am doing leetcode like crazy, and I consider you as a mentor. Can't wait to reach one day and thank you after getting into google.
@devnull711
@devnull711 Жыл бұрын
Great explanation as always, I just listen to you explain the problem. By looking at the problem description I wasn't sure I understood all the cases.
@sahilsharma2518
@sahilsharma2518 5 ай бұрын
Same but by just using split on path, makes it's easier to understand `path_arr = path.split("/") stack = [] for sec in path_arr: # section is not empty and section is not "." which means just current directory if sec != '' and sec != "." if sec == "..": # pop previous val in stack is sec is ".." if stack: stack.pop() else: stack.append(sec) res = "/" + "/".join(stack) return res`
@geekydanish5990
@geekydanish5990 2 жыл бұрын
class Solution: def simplifyPath(self, path: str) -> str: stack = [] path = path.split("/") for p in path: if stack and p == "..": stack.pop() if p.isalnum() or (p != "." and p != ".." and len(p) > 0): stack.append(p) return "/" + "/".join(stack)
@karthik1627
@karthik1627 2 жыл бұрын
Nice alternative solution 👌👌
@andreivilla9009
@andreivilla9009 2 жыл бұрын
This is the exact same solution I came up with, I think it's neater and simpler to understand
@batmunkhn6666
@batmunkhn6666 2 жыл бұрын
just had this question for google
@rahatsshowcase8614
@rahatsshowcase8614 2 жыл бұрын
JS solution: var simplifyPath = function(path) { const segments=path.split("/"); const stack=[]; for (let segment of segments){ if (segment==="" || segment ===".") continue else if (segment==="..") stack.pop() else stack.push(segment) } return "/" + stack.join("/"); };
@jagrutitiwari2551
@jagrutitiwari2551 2 жыл бұрын
I did not need to see the code after listening to your explanation. I solved it just after listening to you.
@ehabteima
@ehabteima Жыл бұрын
It'd be much simpler if you split on / and loop over the list and build your stack
@dreamakash
@dreamakash 2 жыл бұрын
If you go from right to left then you do not even need a stack. / and . can be handled inplace. '..' means skip one directory.
@aakankshajaiswal9770
@aakankshajaiswal9770 2 жыл бұрын
I submitted the solution provided and it was a wrong answer for the test case: "/a//b////c/d//././/..". Therefore, I have modified the solution using while inside while loop and it was accepted. class Solution: def simplifyPath(self, path: str) -> str: stack = [] i = 0 while i < len(path): if path[i] == '/': i += 1 continue else: cur = '' while i < len(path) and path[i] != '/': cur += path[i] i += 1 if cur == '..': if stack: stack.pop() elif cur == '.' or cur == '': i += 1 continue else: stack.append(cur) return '/' + '/'.join(stack)
@curesnow6493
@curesnow6493 2 жыл бұрын
Thank you so much for this simple solution. My solution was too complicated and got stuck.
@mallepallihimasagar955
@mallepallihimasagar955 7 ай бұрын
A better simple way of the solving the question 1. replace all multiple occurring slashes to single slash 2. split the string by "/" 3. now perform the stack operations on the split string array class Solution: def simplifyPath(self, path: str) -> str: stack = [] while "//" in path: path = path.replace("//","/") splitted_string = path.split("/") #split the string with "/" and perform opertations over the stack for op in splitted_string: if op=="..": if stack: stack.pop() else: continue elif op=="." or op=="": continue else: stack.append(op) return "/"+"/".join(stack)
@VladPopov7
@VladPopov7 4 ай бұрын
"join" traverses stack in the FIFO order, but stack is a LIFO order, so I think this property should not be called "stack" or the join method should not be used with stack.
@kywei7485
@kywei7485 2 жыл бұрын
You always give the clearest explanations! Thanks a lot!
@ozgeylmaz8685
@ozgeylmaz8685 11 ай бұрын
I wonder how you approach while solving the question for the first time, how do you split it into smaller part or do you immediately come with the solution at once
@hoyinli7462
@hoyinli7462 3 жыл бұрын
ur videos are just awesome
@kcprxkln
@kcprxkln 3 ай бұрын
using two stacks was more intuitive to me for some reason
@ajith4249
@ajith4249 Жыл бұрын
simple solution stack=[] lis=path.split("/") for items in lis: if(items==".."): if(stack): stack.pop() elif(items!="" and items!="."): stack.append(items) return "/"+"/".join(stack)
@ShivamKumar-qv6em
@ShivamKumar-qv6em 2 жыл бұрын
Great explanation
@rajchavan2886
@rajchavan2886 Жыл бұрын
Isn't modifying input a bad practice in interviews? Context: you added a trailing "/" to the path
@tripham4884
@tripham4884 2 жыл бұрын
really neat solution. Thank you.
@anikaboyd3613
@anikaboyd3613 3 жыл бұрын
Why did the "/" and the end of the for loop definition make the code easier?
@praneeth9002
@praneeth9002 3 жыл бұрын
It helps to add the final scanned directory name to add into the stack
@willowsongbird
@willowsongbird 3 жыл бұрын
@@praneeth9002 how exactly is it helping?
@edwardteach2
@edwardteach2 3 жыл бұрын
For this specific test case: path("/a//b////c/d//././/..") < -- realize there is a ".." at the end of this path, which means we need to pop from the top of their stack If we didn't include the "/" in our for loop, we'll get the wrong answer. I don't like this problem since it's very tricky. But oh well. We needed the "/" at the end of our for loop [for c in path + "/"] in order to pop the 'd'. Thus our answer would be '/a/b/c', not 'a/b/c/d' (if you removed the '/' in the for loop) Best way to explain it is to debug it, then you'll understand.
@lavanya_m01
@lavanya_m01 2 жыл бұрын
@@willowsongbird A simple example is take this case "/abc/def". If you don't add "/" to the end, you wouldn't add "def" to the stack, so ur ans would be "/abc", but if we add "/" to the input, our output will be "/abc/def" which is correct.
@karthikh8993
@karthikh8993 2 жыл бұрын
How can we write the last line of code in c++ instead of join
@anuragchakraborty7607
@anuragchakraborty7607 2 жыл бұрын
You have to use another stack , fill the new stack by popping elements of current stack . And pop each element from the new stack and make a string ans , ans += "/" + newstack->top() ;
@arpitjain5179
@arpitjain5179 2 жыл бұрын
i think it will fail on this test case input : "/../"
@CodeMonkeyy
@CodeMonkeyy Жыл бұрын
Yes I agree. It fails on this test input
@arjunreddy2647
@arjunreddy2647 Жыл бұрын
/I/Love/You
@wallyyu5426
@wallyyu5426 2 жыл бұрын
smooth
@amansayer4943
@amansayer4943 Жыл бұрын
iam shsit bro
@alokesh985
@alokesh985 2 жыл бұрын
If this fails in leetcode, try adding cur != '..' to line 10. This is for test cases like '/..'
@lavanya_m01
@lavanya_m01 2 жыл бұрын
it's not needed.. it'll be handled by the first if statement where we check if cur == '..'
@vatsaljain7029
@vatsaljain7029 4 ай бұрын
i dont understand why you copy others solution and then try to explain them without understanding them one bit. time wasted.
@haroldaltamirano3958
@haroldaltamirano3958 8 ай бұрын
I tried to do the join at the end in c# but it gave me the list in the wrong order, any idea why? public class Solution { public string SimplifyPath(string path) { Stack directories = new(); StringBuilder current = new(); // /home//foo// foreach(char character in (path + "/")){ if(character == '/'){ if(current.ToString() == ".."){ if(directories.Count > 0){ directories.Pop(); } } else if(current.ToString() != "" && current.ToString() != "."){ directories.Push(current.ToString()); } current = new StringBuilder(); } else{ current.Append(character); } } // fix wrong order for return "/" + String.Join( "/", directories); Stack answer = new(); foreach(var directory in directories){ Console.WriteLine($"directory={directory}"); answer.Push(directory); } return "/" + String.Join( "/", answer); } }
@davidpetro1780
@davidpetro1780 Жыл бұрын
amazing explanation
@thanirmalai
@thanirmalai Жыл бұрын
Great explanation
Decode String - Leetcode 394 - Python
16:26
NeetCode
Рет қаралды 93 М.
Gas Station - Greedy - Leetcode 134 - Python
15:47
NeetCode
Рет қаралды 142 М.
УДИВИЛ ВСЕХ СВОИМ УХОДОМ!😳 #shorts
00:49
HARD_MMA
Рет қаралды 3,3 МЛН
SIZE DOESN’T MATTER @benjaminjiujitsu
00:46
Natan por Aí
Рет қаралды 3,5 МЛН
How To Choose Mac N Cheese Date Night.. 🧀
00:58
Jojo Sim
Рет қаралды 98 МЛН
coco在求救? #小丑 #天使 #shorts
00:29
好人小丑
Рет қаралды 30 МЛН
Please Master These 10 Python Functions…
22:17
Tech With Tim
Рет қаралды 218 М.
SIMPLIFY PATH | PYTHON | LEETCODE # 71
10:54
Cracking FAANG
Рет қаралды 2,5 М.
This Algorithm is 1,606,240% FASTER
13:31
ThePrimeagen
Рет қаралды 853 М.
Implement Trie (Prefix Tree) - Leetcode 208
18:56
NeetCode
Рет қаралды 213 М.
Simplify Path | Leetcode 71 | Stack | Day-14
17:39
Ayushi Sharma
Рет қаралды 10 М.
Edit Distance - Dynamic Programming - Leetcode 72 - Python
21:00
Maximum Swaps - Leetcode 670 - Python
15:40
NeetCodeIO
Рет қаралды 13 М.
Daily Temperatures - Monotonic Stack - Leetcode 739 - Python
11:52
Perfect Squares - Dynamic Programming - Leetcode 279 - Python
15:12
Word Break - Dynamic Programming - Leetcode 139 - Python
15:35
УДИВИЛ ВСЕХ СВОИМ УХОДОМ!😳 #shorts
00:49
HARD_MMA
Рет қаралды 3,3 МЛН