در این مطلب، ویدئو رشته پرانتز معتبر – Leetcode 678 – Python با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 00:14:35
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:00,000 –> 00:00:02,720
این ویدیو توسط educative.io حمایت میشود و
2
00:00:02,720 –> 00:00:05,200
به educative.io سر بزنید
3
00:00:05,200 –> 00:00:07,680
تا 10 کد را در اشتراک خود ذخیره
4
00:00:07,680 –> 00:00:09,760
کنید تا در یک لحظه به شما
5
00:00:09,760 –> 00:00:11,360
خوش آمدید و بیایید
6
00:00:11,360 –> 00:00:13,360
امروز کد دقیقتری بنویسیم، بنابراین امروز بیایید این مشکل را حل
7
00:00:13,360 –> 00:00:16,320
کنیم که رشته پرانتز معتبر است. ما
8
00:00:16,320 –> 00:00:18,240
چند مشکل مربوط به پرانتز
9
00:00:18,240 –> 00:00:19,840
را در این کانال حل کردهایم، اما این
10
00:00:19,840 –> 00:00:22,000
بسیار منحصر به فرد است، بنابراین یک رشته به ما داده
11
00:00:22,000 –> 00:00:23,920
میشود و میتواند شامل سه
12
00:00:23,920 –> 00:00:26,960
نوع کاراکتر باشد، یک پرانتز چپ، یک
13
00:00:26,960 –> 00:00:29,760
پرانتز سمت راست، یک کاراکتر کارت وحشی و یک
14
00:00:29,760 –> 00:00:32,079
کارت وحشی. کاراکتر
15
00:00:32,079 –> 00:00:32,960
می
16
00:00:32,960 –> 00:00:35,760
تواند سه احتمال باشد، می تواند یک
17
00:00:35,760 –> 00:00:37,520
رشته خالی باشد که ساده ترین سمت راست است،
18
00:00:37,520 –> 00:00:38,960
بنابراین اساساً در آن صورت ما
19
00:00:38,960 –> 00:00:42,079
کارت وحشی را نادیده می گیریم، ممکن است یک پرانتز سمت راست باشد
20
00:00:42,079 –> 00:00:44,399
یا می تواند یک پرانتز چپ باشد،
21
00:00:44,399 –> 00:00:45,920
بنابراین
22
00:00:45,920 –> 00:00:48,480
هر بار که به یک کارت وحشی
23
00:00:48,480 –> 00:00:50,320
در شرایط یک درخت تصمیم ما
24
00:00:50,320 –> 00:00:52,239
واقعاً سه شاخه سمت راست داریم، سه
25
00:00:52,239 –> 00:00:53,920
چیز متفاوت داریم که میتوانیم در نظر بگیریم که
26
00:00:53,920 –> 00:00:55,920
میتواند یک فاصله باشد، میتواند یک
27
00:00:55,920 –> 00:00:57,039
پرانتز چپ باشد، میتواند یک
28
00:00:57,039 –> 00:00:58,960
پرانتز راست باشد، بنابراین البته ما به
29
00:00:58,960 –> 00:01:00,640
نوعی درک می کنیم که چگونه
30
00:01:00,640 –> 00:01:02,800
این مشکل را حل کنیم یا حداقل همه
31
00:01:02,800 –> 00:01:05,119
احتمالات را برشماریم هدف ما این است که تعیین کنیم
32
00:01:05,119 –> 00:01:08,320
آیا رشته داده شده می تواند معتبر باشد در صورت
33
00:01:08,320 –> 00:01:10,400
امکان، اگر
34
00:01:10,400 –> 00:01:13,119
غیرممکن است true را برگردانیم، false را برگردانیم و می توانید به آن ادامه دهید
35
00:01:13,119 –> 00:01:15,280
. این برای درک اینکه چه چیزی
36
00:01:15,280 –> 00:01:18,000
پرانتزها را معتبر و نامعتبر میکند،
37
00:01:18,000 –> 00:01:20,640
نکته اصلی این است که وقتی یک رشته را اسکن میکنید،
38
00:01:20,640 –> 00:01:22,880
فرض کنید این یکی واقعاً
39
00:01:22,880 –> 00:01:25,200
اتفاق میافتد این است که هر پرانتز سمت چپ
40
00:01:25,200 –> 00:01:27,759
باید یک پرانتز راست منطبق داشته باشد
41
00:01:27,759 –> 00:01:29,360
و پرانتز راست منطبق
42
00:01:29,360 –> 00:01:32,079
باید بعد از سمت چپ بیاید. پرانتز و
43
00:01:32,079 –> 00:01:34,079
ترتیب طبیعی آن به نوعی مانند
44
00:01:34,079 –> 00:01:35,840
اول در ابتدا به بیرون است، بنابراین می توانید ببینید
45
00:01:35,840 –> 00:01:37,280
که یک پرانتز چپ داریم، سپس
46
00:01:37,280 –> 00:01:39,119
یک پرانتز چپ دیگر داریم، سپس یک
47
00:01:39,119 –> 00:01:40,240
پرانتز سمت راست داریم و این پرانتز سمت راست
48
00:01:40,240 –> 00:01:42,240
با این یکی مطابقت دارد، خوب است، سپس
49
00:01:42,240 –> 00:01:43,759
یک پرانتز چپ دیگر داریم.
50
00:01:43,759 –> 00:01:45,759
سپس یک پرانتز سمت راست داریم که
51
00:01:45,759 –> 00:01:47,520
با جدیدترین آنها مطابقت دارد و سپس
52
00:01:47,520 –> 00:01:49,280
یک پرانتز سمت راست دیگر داریم و این
53
00:01:49,280 –> 00:01:51,840
با این یکی مطابقت دارد، اما فرض کنید یک sl داشتیم.
54
00:01:51,840 –> 00:01:53,920
رشتههای تقریباً متفاوت ممکن است ما
55
00:01:53,920 –> 00:01:56,320
سه پرانتز سمت راست پشت سر
56
00:01:56,320 –> 00:01:59,600
هم داشته باشیم، این نامعتبر است و میتوانید ببینید که چرا
57
00:01:59,600 –> 00:02:01,680
این دو با یکدیگر مطابقت دارند، این
58
00:02:01,680 –> 00:02:04,399
یکی با این یکی عالی مطابقت دارد، اما پرانتز سمت راست
59
00:02:04,399 –> 00:02:06,880
قبل از پرانتز چپ میآید،
60
00:02:06,880 –> 00:02:09,199
ما نمیتوانیم آن را داشته باشیم. و
61
00:02:09,199 –> 00:02:10,639
این یکی از راههای فهمیدن آن است، اما
62
00:02:10,639 –> 00:02:12,080
سادهترین راه برای دانستن اینکه ما یک
63
00:02:12,080 –> 00:02:15,200
ترکیب پرانتز نامعتبر داریم این است که
64
00:02:15,200 –> 00:02:16,959
در هر نقطه
65
00:02:16,959 –> 00:02:18,959
از رشته، تعداد
66
00:02:18,959 –> 00:02:21,360
پرانتزهای چپی که داریم هرگز نمیتواند
67
00:02:21,360 –> 00:02:22,800
از تعداد
68
00:02:22,800 –> 00:02:24,319
پرانتزهای راست و شما کمتر باشد. می توانید ببینید که این
69
00:02:24,319 –> 00:02:26,879
اتفاق در اینجا رخ می دهد، ما دو
70
00:02:26,879 –> 00:02:28,720
پرانتز چپ داریم، سپس سه پرانتز سمت راست
71
00:02:28,720 –> 00:02:31,200
داریم و هرگز نخواهیم
72
00:02:31,200 –> 00:02:33,360
توانست از این وضعیت خلاص شویم، زیرا در یک
73
00:02:33,360 –> 00:02:34,720
مقطع زمانی تعداد پرانتزهای سمت راست ما بیشتر
74
00:02:34,720 –> 00:02:36,720
از آنچه که گذاشته بودیم،
75
00:02:36,720 –> 00:02:38,720
مهم نیست. اگر پرانتزهای چپ بیشتری دریافت
76
00:02:38,720 –> 00:02:40,879
کنیم، هرگز نمیتوانیم از این مورد بازیابی کنیم و به
77
00:02:40,879 –> 00:02:42,800
این ترتیب میدانید که نامعتبر است،
78
00:02:42,800 –> 00:02:45,760
بیایید یک رشته ورودی بسیار ساده بگیریم و سپس
79
00:02:45,760 –> 00:02:48,080
تعیین کنیم که آیا این معتبر است یا نه و
80
00:02:48,080 –> 00:02:50,000
میتوانیم بگویید که
81
00:02:50,000 –> 00:02:52,800
اگر کارت وحشی خالی بود
82
00:02:52,800 –> 00:02:54,239
و مانند
83
00:02:54,239 –> 00:02:55,760
یک پرانتز چپ و راست به نظر می رسید چقدر معتبر است، اما چگونه می
84
00:02:55,760 –> 00:02:58,159
توانیم آن نیروی بی رحم را انجام دهیم و
85
00:02:58,159 –> 00:03:00,640
شاید بتوانیم رشته های پیچیده تری
86
00:03:00,640 –> 00:03:02,319
داشته باشیم. ما تعیین می کنیم که
87
00:03:02,319 –> 00:03:04,239
نیروی بی رحم درخت تصمیم خواهد بود،
88
00:03:04,239 –> 00:03:06,239
زیرا اگر به ما هیچ کارت وحشی داده نمی شد
89
00:03:06,239 –> 00:03:08,000
، یک الگوریتم بسیار ساده داریم که
90
00:03:08,000 –> 00:03:09,920
فقط از داخل پرانتز اسکن می کنیم تا
91
00:03:09,920 –> 00:03:11,920
بدانیم آیا آنها درست هستند یا نه درست همانطور
92
00:03:11,920 –> 00:03:14,239
که در مورد آن صحبت کردم، بلکه با کارتهای وحشی
93
00:03:14,239 –> 00:03:16,159
احتمالات زیادی وجود دارد که
94
00:03:16,159 –> 00:03:18,319
میخواهیم از طریق هر کاراکتر در رشته مرور کنیم
95
00:03:18,319 –> 00:03:20,720
و یک درخت تصمیم داشته باشیم، بنابراین اولین
96
00:03:20,720 –> 00:03:22,959
کاراکتری که میبینیم یک پرانتز سمت چپ است
97
00:03:22,959 –> 00:03:25,120
که کاملاً خوب است و سپس
98
00:03:25,120 –> 00:03:26,879
درست زمانی که به یک وحشی رسیدید به کارت
99
00:03:26,879 –> 00:03:28,400
وحشی میرسیم. کارت زمانی است که شما واقعاً نیاز
100
00:03:28,400 –> 00:03:30,159
به انشعاب دارید، ما لازم نیست فقط
101
00:03:30,159 –> 00:03:32,159
وقتی به یک پرانتز معمولی میرسیم شاخه کنیم،
102
00:03:32,159 –> 00:03:33,760
زیرا قبلاً مشخص شده است که
103
00:03:33,760 –> 00:03:35,440
میتواند یک پرانتز چپ دیگر باشد،
104
00:03:35,440 –> 00:03:38,159
میتواند یک فاصله یا میتواند یک پرانتز راست باشد.
105
00:03:38,159 –> 00:03:39,360
s
106
00:03:39,360 –> 00:03:40,480
و سپس به شخصیت سوم می
107
00:03:40,480 –> 00:03:42,480
رسیم، اما باید
108
00:03:42,480 –> 00:03:44,080
آن کاراکتر سوم را انجام دهیم، از قبل مشخص شده است که این یک
109
00:03:44,080 –> 00:03:45,360
پرانتز درست است، اما ما باید این کار را
110
00:03:45,360 –> 00:03:47,200
برای هر سه شاخه خود
111
00:03:47,200 –> 00:03:49,360
انجام دهیم تا بتوانید ببینید بسیاری از
112
00:03:49,360 –> 00:03:50,319
کارت های وحشی
113
00:03:50,319 –> 00:03:52,400
این درخت تصمیم بسیار بزرگ می شود،
114
00:03:52,400 –> 00:03:54,319
اما اجازه دهید آن را خیلی سریع تمام کنیم،
115
00:03:54,319 –> 00:03:56,879
بنابراین در اینجا یک پرانتز سمت راست
116
00:03:56,879 –> 00:03:58,480
خواهیم داشت، در اینجا یک پرانتز سمت
117
00:03:58,480 –> 00:04:00,400
راست خواهیم داشت، بنابراین
118
00:04:00,400 –> 00:04:02,319
در بین هر سه مورد، یک پرانتز راست خواهیم داشت. با این ترکیب ها
119
00:04:02,319 –> 00:04:04,159
می توانید ببینید که این نامعتبر است
120
00:04:04,159 –> 00:04:07,200
زیرا دو تا باز دارد دو تا چپ دارد یکی
121
00:04:07,200 –> 00:04:09,280
راست که نامعتبر است این یکی که می توانید
122
00:04:09,280 –> 00:04:11,439
ببینید هم نامعتبر است یک چپ و
123
00:04:11,439 –> 00:04:13,599
سپس دو سمت راست دارد اما وسطی که
124
00:04:13,599 –> 00:04:15,760
می بینید معتبر است دارد یک فاصله سمت چپ
125
00:04:15,760 –> 00:04:17,440
و سپس یک راست و روشی که
126
00:04:17,440 –> 00:04:19,120
میتوانیم این مشکل را به صورت بازگشتی انجام دهیم،
127
00:04:19,120 –> 00:04:20,798
بخش درخت تصمیم به نوعی ساده است،
128
00:04:20,798 –> 00:04:22,560
ما هر بار که به یک کارت وایلد میرسیم، سه تماس بازگشتی برقرار
129
00:04:22,560 –> 00:04:26,080
میکنیم، اما برای
130
00:04:26,080 –> 00:04:28,320
تعیین اینکه آیا معتبر است یا نه، یکی را انجام میدهیم.
131
00:04:28,320 –> 00:04:30,000
تعداد باقی مانده ها را پیگیری می کرد
132
00:04:30,000 –> 00:04:32,320
ما چند
133
00:04:32,320 –> 00:04:34,960
پرانتز داشتیم که در این مرحله چند پرانتز چپ
134
00:04:34,960 –> 00:04:36,639
باز
135
00:04:36,639 –> 00:04:37,840
داشتیم، اگر فقط شاخه وسط
136
00:04:37,840 –> 00:04:40,240
را در نظر بگیریم، یک پرانتز باز
137
00:04:40,240 –> 00:04:42,720
داشتیم و سپس در انتهای آن، یک پرانتز باز داشتیم.
138
00:04:42,720 –> 00:04:45,520
در پایان
139
00:04:45,520 –> 00:04:47,040
باید دقیقاً صفر داشته باشیم زیرا
140
00:04:47,040 –> 00:04:49,120
همه آنها باید با یکدیگر مطابقت داشته باشند و
141
00:04:49,120 –> 00:04:51,360
تعداد بازهای چپ هرگز نباید
142
00:04:51,360 –> 00:04:53,440
منفی باشد، به عنوان مثال
143
00:04:53,440 –> 00:04:54,880
اگر اینطور درست شروع کنیم اگر با یک پرانتز راست شروع کردیم
144
00:04:54,880 –> 00:04:57,199
که به طور خودکار نامعتبر است،
145
00:04:57,199 –> 00:04:59,680
بنابراین این راه حل بازگشتی است
146
00:04:59,680 –> 00:05:01,680
و می توانید در واقع برنامه نویسی پویا را اضافه کنید
147
00:05:01,680 –> 00:05:03,680
و منظور من از برنامه نویسی پویا،
148
00:05:03,680 –> 00:05:05,600
یادداشت کردن است که راه ساده تری
149
00:05:05,600 –> 00:05:08,960
برای انجام آن به این راه حل بازگشتی است
150
00:05:08,960 –> 00:05:10,880
و اگر می خواهید قبل از هر چیز به پیچیدگی کلی زمان نگاهی بیندازید، در واقع کد را به آن
151
00:05:10,880 –> 00:05:12,240
در توضیحات مرتبط می کنم.
152
00:05:12,240 –> 00:05:14,320
153
00:05:14,320 –> 00:05:16,479
راه حل brute force
154
00:05:16,479 –> 00:05:19,120
در بدترین حالت 3 به
155
00:05:19,120 –> 00:05:20,720
توان n خواهد بود زیرا تعداد
156
00:05:20,720 –> 00:05:22,479
شاخه های ما n به
157
00:05:22,479 –> 00:05:24,000
اندازه رشته خواهد بود زیرا این مقدار است.
158
00:05:24,000 –> 00:05:25,840
ارتفاع این درخت تصمیم گیری باشد،
159
00:05:25,840 –> 00:05:27,840
اما زمانی که شما حافظه را به آن اضافه می کنید
160
00:05:27,840 –> 00:05:29,600
، پیچیدگی کلی زمانی در واقع
161
00:05:29,600 –> 00:05:31,440
به n مکعب تبدیل می شود
162
00:05:31,440 –> 00:05:32,880
و روشی که ما این کار را انجام می دهیم با
163
00:05:32,880 –> 00:05:35,199
کش کردن است و ما با دو
164
00:05:35,199 –> 00:05:37,199
پارامتر یکی i خواهد بود که
165
00:05:37,199 –> 00:05:38,880
شاخص آن است. موقعیتی که در آن قرار داریم و
166
00:05:38,880 –> 00:05:40,960
پارامتر دیگر
167
00:05:40,960 –> 00:05:43,360
تعداد پرانتزهای باز سمت چپ در هر نقطه معینی
168
00:05:43,360 –> 00:05:44,160
169
00:05:44,160 –> 00:05:46,400
از رشته است که اکنون در حال ذخیره کردن آن
170
00:05:46,400 –> 00:05:48,320
با دو پارامتر مختلف مانند این
171
00:05:48,320 –> 00:05:50,080
هستیم، باعث می شود ماتریس دو بعدی
172
00:05:50,080 –> 00:05:52,160
به اندازه داشته باشیم. آن ماتریس
173
00:05:52,160 –> 00:05:54,320
قرار است n مجذور شود، اما برای محاسبه هر
174
00:05:54,320 –> 00:05:57,120
مقدار در آن ماتریس،
175
00:05:57,120 –> 00:05:58,800
پیچیدگی زیادی از n زمان نیاز خواهد داشت، به همین دلیل است که
176
00:05:58,800 –> 00:06:00,880
من n را مکعب
177
00:06:00,880 –> 00:06:02,479
میکنم، اما اگر میخواهید، انتظار ندارم که همه اینها را بفهمید.
178
00:06:02,479 –> 00:06:04,000
آن را کمی بیشتر درک کنید،
179
00:06:04,000 –> 00:06:05,919
می توانید به کدی که در توضیحات خواهم داشت نگاه کنید،
180
00:06:05,919 –> 00:06:07,680
اما در واقع
181
00:06:07,680 –> 00:06:09,360
یک راه کارآمدتر برای حل این
182
00:06:09,360 –> 00:06:12,080
مشکل وجود دارد و آن راه حل حریصانه است
183
00:06:12,080 –> 00:06:14,000
و حتی اگر بتوانید اکنون به آن دست پیدا کنید بسیار دشوار است.
184
00:06:14,000 –> 00:06:15,440
185
00:06:15,440 –> 00:06:17,600
خودتان به راه حل مدرک دست پیدا کنید، ممکن است
186
00:06:17,600 –> 00:06:19,360
هنوز در یک مصاحبه واقعی به ذهنتان خطور کند
187
00:06:19,360 –> 00:06:21,199
که شاید نوعی ترفند برای
188
00:06:21,199 –> 00:06:22,960
این مشکل وجود دارد که اگر فقط می توانستید
189
00:06:22,960 –> 00:06:25,039
آن را بفهمید، می توانید
190
00:06:25,039 –> 00:06:27,120
این مشکل را در زمان خطی حل کنید.
191
00:06:27,120 –> 00:06:29,600
ترفندی مانند آن به خوبی امیدوارم در یک مصاحبه واقعی،
192
00:06:29,600 –> 00:06:31,120
مصاحبهگر شما به
193
00:06:31,120 –> 00:06:33,039
شما راهنمایی برای آن بدهد، اما بیایید ببینیم چگونه میتوانیم
194
00:06:33,039 –> 00:06:35,280
خودمان به آن دست پیدا کنیم،
195
00:06:35,280 –> 00:06:37,120
میدانیم که یک متغیر
196
00:06:37,120 –> 00:06:38,880
برای ما اجباری خواهد بود و من میخواهم
197
00:06:38,880 –> 00:06:40,800
آن را چپ صدا کنید تعداد
198
00:06:40,800 –> 00:06:43,680
پرانتزهای باز سمت چپ ما خواهد بود و
199
00:06:43,680 –> 00:06:45,600
وقتی به کاراکتر اول رسیدیم یک پرانتز باز سمت چپ است
200
00:06:45,600 –> 00:06:47,600
در ابتدا مجموع
201
00:06:47,600 –> 00:06:50,160
ما صفر می شود اما پس از دیدن
202
00:06:50,160 –> 00:06:51,840
پرانتز باز سمت چپ آن را
203
00:06:51,840 –> 00:06:53,840
یک عدد افزایش می دهیم. یک پرانتز باز سمت چپ
204
00:06:53,840 –> 00:06:56,080
و این خیلی آسان است،
205
00:06:56,080 –> 00:06:57,919
فرض کنید کارت وایلد
206
00:06:57,919 –> 00:07:00,000
را نداشتیم، سپس یک پرانتز سمت راس