|
59 | 59 |
|
60 | 60 | <!-- 这里可写通用的实现逻辑 -->
|
61 | 61 |
|
| 62 | +**方法一:栈** |
| 63 | + |
| 64 | +我们将字符串 `preorder` 按逗号分割成数组,然后遍历数组,如果遇到了连续两个 `'#'`,并且第三个元素不是 `'#'`,那么就将这三个元素替换成一个 `'#'`,这个过程一直持续到数组遍历结束。 |
| 65 | + |
| 66 | +最后,判断数组长度是否为 $1$,且数组唯一的元素是否为 `'#'` 即可。 |
| 67 | + |
| 68 | +时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 `preorder` 的长度。 |
| 69 | + |
62 | 70 | <!-- tabs:start -->
|
63 | 71 |
|
64 | 72 | ### **Python3**
|
65 | 73 |
|
66 | 74 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
67 | 75 |
|
68 | 76 | ```python
|
69 |
| - |
| 77 | +class Solution: |
| 78 | + def isValidSerialization(self, preorder: str) -> bool: |
| 79 | + stk = [] |
| 80 | + for c in preorder.split(","): |
| 81 | + stk.append(c) |
| 82 | + while len(stk) > 2 and stk[-1] == stk[-2] == "#" and stk[-3] != "#": |
| 83 | + stk = stk[:-3] |
| 84 | + stk.append("#") |
| 85 | + return len(stk) == 1 and stk[0] == "#" |
70 | 86 | ```
|
71 | 87 |
|
72 | 88 | ### **Java**
|
73 | 89 |
|
74 | 90 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
75 | 91 |
|
76 | 92 | ```java
|
| 93 | +class Solution { |
| 94 | + public boolean isValidSerialization(String preorder) { |
| 95 | + String[] strs = preorder.split(","); |
| 96 | + int diff = 1; |
| 97 | + for (String s : strs) { |
| 98 | + if (--diff < 0) { |
| 99 | + return false; |
| 100 | + } |
| 101 | + if (!s.equals("#")) { |
| 102 | + diff += 2; |
| 103 | + } |
| 104 | + } |
| 105 | + return diff == 0; |
| 106 | + } |
| 107 | +} |
| 108 | +``` |
| 109 | + |
| 110 | +```java |
| 111 | +class Solution { |
| 112 | + public boolean isValidSerialization(String preorder) { |
| 113 | + List<String> stk = new ArrayList<>(); |
| 114 | + for (String s : preorder.split(",")) { |
| 115 | + stk.add(s); |
| 116 | + while (stk.size() >= 3 |
| 117 | + && stk.get(stk.size() - 1).equals("#") |
| 118 | + && stk.get(stk.size() - 2).equals("#") |
| 119 | + && !stk.get(stk.size() - 3).equals("#")) { |
| 120 | + stk.remove(stk.size() - 1); |
| 121 | + stk.remove(stk.size() - 1); |
| 122 | + stk.remove(stk.size() - 1); |
| 123 | + stk.add("#"); |
| 124 | + } |
| 125 | + } |
| 126 | + return stk.size() == 1 && stk.get(0).equals("#"); |
| 127 | + } |
| 128 | +} |
| 129 | +``` |
| 130 | + |
| 131 | +### **C++** |
| 132 | + |
| 133 | +```cpp |
| 134 | +class Solution { |
| 135 | +public: |
| 136 | + bool isValidSerialization(string preorder) { |
| 137 | + vector<string> stk; |
| 138 | + stringstream ss(preorder); |
| 139 | + string s; |
| 140 | + while (getline(ss, s, ',')) { |
| 141 | + stk.push_back(s); |
| 142 | + while (stk.size() >= 3 && stk[stk.size() - 1] == "#" && stk[stk.size() - 2] == "#" && stk[stk.size() - 3] != "#") { |
| 143 | + stk.pop_back(); |
| 144 | + stk.pop_back(); |
| 145 | + stk.pop_back(); |
| 146 | + stk.push_back("#"); |
| 147 | + } |
| 148 | + } |
| 149 | + return stk.size() == 1 && stk[0] == "#"; |
| 150 | + } |
| 151 | +}; |
| 152 | +``` |
77 | 153 |
|
| 154 | +### **Go** |
| 155 | +
|
| 156 | +```go |
| 157 | +func isValidSerialization(preorder string) bool { |
| 158 | + stk := []string{} |
| 159 | + for _, s := range strings.Split(preorder, ",") { |
| 160 | + stk = append(stk, s) |
| 161 | + for len(stk) >= 3 && stk[len(stk)-1] == "#" && stk[len(stk)-2] == "#" && stk[len(stk)-3] != "#" { |
| 162 | + stk = stk[:len(stk)-3] |
| 163 | + stk = append(stk, "#") |
| 164 | + } |
| 165 | + } |
| 166 | + return len(stk) == 1 && stk[0] == "#" |
| 167 | +} |
78 | 168 | ```
|
79 | 169 |
|
80 | 170 | ### **...**
|
|
0 commit comments