Làm tý algorithms nào mấy tml

Thích_Yến_Trân

Lồn phải lá han
Basque-Country
CE2AE383-12BB-4B09-86E3-59093DF8DA97.jpg
Lý thuyết suông thì gg đầy zồi. Bài này tml nào giải thích đc cách giải của mình thì t thấy kỹ năng sư phạm của nó sẽ tốt lắm đấy. Nhiều ng thấy lên mạng đọc giải r bắt gthich lại thì cũng ậm ừ vl
 
Tao đọc rule rồi, bài này chưa làm. Cho tao hỏi ")(" thì có valid không?
 
Tao cho chạy 2 pointers. Một cái ở đầu và một cái ở cuối. Và hai biến để đếm số ngoặc trái, ngoặc phải
int left = 0, right = s.length() - 1;
int countLeft = 0, countRight = 0;
while (left <= right) {
If s.charAt(left) == "(" {
countLeft++;
left++;
}
If s.charAt(right) == ")" {
counRight++;
right--;
}
If s.charAt(left) == "*" or s.charAt(right) == "*" {
If(countRight < countLeft) countRight++;
Else If countRight > countLeft countLeft++;
}
Left++;
Right--;
}
Return countRight == countLeft;
 
Ý tưởng tao là vậy. Cho hai pointer chạy hai đầu, xong đếm ngoặc trái ngoặc phải. Nếu trên đường đi gặp *, nếu số ngoặc trái bé hơn ngoặc phải thì countLeft++. Nếu số ngoặc phải bé hơn ngoặc trái thì countRight++. Còn bằng nhau thì kệ mẹ. Hết vòng lặp, ra ngoài xem số ngoặc trái có bằng ngoặc phải k.
 
Tao chưa làm, với lại viết trên đt nên cũng chưa chạy test case thử để có gì về nhà làm thử bài này. Thằng nào có ý tưởng thì vô chia sẻ nha
 
Ý tưởng tao là vậy. Cho hai pointer chạy hai đầu, xong đếm ngoặc trái ngoặc phải. Nếu trên đường đi gặp *, nếu số ngoặc trái bé hơn ngoặc phải thì countLeft++. Nếu số ngoặc phải bé hơn ngoặc trái thì countRight++. Còn bằng nhau thì kệ mẹ. Hết vòng lặp, ra ngoài xem số ngoặc trái có bằng ngoặc phải k.
Vậy trường hợp “)))(((“ nó vẫn return true ahk?
 
có phải thế này ko tụi bây
đếm từ đầu đến đít
( thì cộng 1 vào A
) thì trừ A đi 1
* thì cộng 1 vào B
nếu A bé hơn 0 thì {
nếu B <= 0 thì loại (break)
trừ B đi 1 cộng 1 vào A }
nếu A = 0 thì B := 0
 
mải xem fim sếch, giờ mới đọc đề xong
mẹ bài xàm loz này có gì đâu :sweat:

1. duyệt 1 lượt từ dấu ')' đầu tiên đến dấu cuối cùng chuỗi có dấu '(' thì return false // đến đây để chắc kèo '(' luôn ở nửa trái, ')' ở nửa phải
2. đếm xem bao nhiêu dấu '(', ')', bao nhiêu dấu * ở trước '(' cuối cùng , bao nhiêu dấu * ở sau ')' đầu tiên, bao nhiêu dấu * ở giữa ( cuối cùng và ) đầu tiên // gọi là starleft, starmid, starright

nếu '(' = ')' thì return true
nếu '(' > ')' k lần, nếu k <= starright + starmid thì return true; k > starright + starmid return false;
nếu '(' < ')' k lần, nếu k <= starleft + starmid thì return true; k > starleft + starmid return false;
 
mải xem fim sếch, giờ mới đọc đề xong
mẹ bài xàm loz này có gì đâu :sweat:

1. duyệt 1 lượt từ dấu ')' đầu tiên đến dấu cuối cùng chuỗi có dấu '(' thì return false // đến đây để chắc kèo '(' luôn ở nửa trái, ')' ở nửa phải
2. đếm xem bao nhiêu dấu '(', ')', bao nhiêu dấu * ở trước '(' cuối cùng , bao nhiêu dấu * ở sau ')' đầu tiên, bao nhiêu dấu * ở giữa ( cuối cùng và ) đầu tiên // gọi là starleft, starmid, starright

nếu '(' = ')' thì return true
nếu '(' > ')' k lần, nếu k <= starright + starmid thì return true; k > starright + starmid return false;
nếu '(' < ')' k lần, nếu k <= starleft + starmid thì return true; k > starleft + starmid return false;
ý tưởng là thế, rất mạch lạc rõ ràng và vô cùng dễ hiểu
nhưng code có vẻ dài :)
quá nhiều vòng for đơn
 
mải xem fim sếch, giờ mới đọc đề xong
mẹ bài xàm loz này có gì đâu :sweat:

1. duyệt 1 lượt từ dấu ')' đầu tiên đến dấu cuối cùng chuỗi có dấu '(' thì return false // đến đây để chắc kèo '(' luôn ở nửa trái, ')' ở nửa phải
2. đếm xem bao nhiêu dấu '(', ')', bao nhiêu dấu * ở trước '(' cuối cùng , bao nhiêu dấu * ở sau ')' đầu tiên, bao nhiêu dấu * ở giữa ( cuối cùng và ) đầu tiên // gọi là starleft, starmid, starright

nếu '(' = ')' thì return true
nếu '(' > ')' k lần, nếu k <= starright + starmid thì return true; k > starright + starmid return false;
nếu '(' < ')' k lần, nếu k <= starleft + starmid thì return true; k > starleft + starmid return false;
Ý thứ 1 của mày nếu test cái này sẽ bị sai "(((())))()"
 
Còn case này “())(()”. Của m ra true nhỉ
Cái này thì không có trong edge cases. Cái này handle bằng logic mà mày implement thôi. Mà t thấy thuật toán của tao cũng đ đúng lắm. Để chút về nhà mở máy ra xem
 
dấu ) đầu tiên của chuỗi đến dấu cuối cùng là đoạn này "))))()" lòi ra dấu ( kia
sao sai được
Mày nói từ dấu ")" đến dấu ")" cuối cùng, trong đoạn đó nếu gặp "(" thì return false. Trường hợp đó không đúng với case này "(())()", case này vẫn là true
 

Có thể bạn quan tâm

Top