|
60 | 60 |
|
61 | 61 | <!-- 这里可写通用的实现逻辑 -->
|
62 | 62 |
|
| 63 | +**方法一:记忆化搜索** |
| 64 | + |
| 65 | +设计函数 `dfs(i, cnt)` 表示从下标 `i` 开始,且当前已经分配了 `cnt` 个座位的方案数。 |
| 66 | + |
| 67 | +对于下标 `i` 处的字符,如果是 `S`,那么 `cnt` 加 `1`,如果此时 `cnt` 超过 `2`,那么直接返回 `0`。 |
| 68 | + |
| 69 | +否则我们可以选择不放置屏风,此时的方案数为 `dfs(i + 1, cnt)`;如果此时 `cnt` 为 `2`,我们还可以选择放置屏风,此时的方案数为 `dfs(i + 1, 0)`。 |
| 70 | + |
| 71 | +最终返回方案数,记忆化搜索即可。 |
| 72 | + |
| 73 | +时间复杂度 $O(n\times 3)$,空间复杂度 $O(n\times 3)$。其中 $n$ 为字符串 `corridor` 的长度。 |
| 74 | + |
63 | 75 | <!-- tabs:start -->
|
64 | 76 |
|
65 | 77 | ### **Python3**
|
66 | 78 |
|
67 | 79 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
68 | 80 |
|
69 | 81 | ```python
|
70 |
| - |
| 82 | +class Solution: |
| 83 | + def numberOfWays(self, corridor: str) -> int: |
| 84 | + @cache |
| 85 | + def dfs(i, cnt): |
| 86 | + if i == n: |
| 87 | + return int(cnt == 2) |
| 88 | + cnt += corridor[i] == 'S' |
| 89 | + if cnt > 2: |
| 90 | + return 0 |
| 91 | + ans = dfs(i + 1, cnt) |
| 92 | + if cnt == 2: |
| 93 | + ans += dfs(i + 1, 0) |
| 94 | + ans %= mod |
| 95 | + return ans |
| 96 | + |
| 97 | + n = len(corridor) |
| 98 | + mod = 10**9 + 7 |
| 99 | + ans = dfs(0, 0) |
| 100 | + dfs.cache_clear() |
| 101 | + return ans |
71 | 102 | ```
|
72 | 103 |
|
73 | 104 | ### **Java**
|
74 | 105 |
|
75 | 106 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
76 | 107 |
|
77 | 108 | ```java
|
| 109 | +class Solution { |
| 110 | + private String s; |
| 111 | + private int n; |
| 112 | + private int[][] f; |
| 113 | + private static final int MOD = (int) 1e9 + 7; |
| 114 | + |
| 115 | + public int numberOfWays(String corridor) { |
| 116 | + s = corridor; |
| 117 | + n = s.length(); |
| 118 | + f = new int[n][3]; |
| 119 | + for (var e : f) { |
| 120 | + Arrays.fill(e, -1); |
| 121 | + } |
| 122 | + return dfs(0, 0); |
| 123 | + } |
| 124 | + |
| 125 | + private int dfs(int i, int cnt) { |
| 126 | + if (i == n) { |
| 127 | + return cnt == 2 ? 1 : 0; |
| 128 | + } |
| 129 | + cnt += s.charAt(i) == 'S' ? 1 : 0; |
| 130 | + if (cnt > 2) { |
| 131 | + return 0; |
| 132 | + } |
| 133 | + if (f[i][cnt] != -1) { |
| 134 | + return f[i][cnt]; |
| 135 | + } |
| 136 | + int ans = dfs(i + 1, cnt); |
| 137 | + if (cnt == 2) { |
| 138 | + ans += dfs(i + 1, 0); |
| 139 | + ans %= MOD; |
| 140 | + } |
| 141 | + f[i][cnt] = ans; |
| 142 | + return ans; |
| 143 | + } |
| 144 | +} |
| 145 | +``` |
78 | 146 |
|
| 147 | +### **C++** |
| 148 | + |
| 149 | +```cpp |
| 150 | +class Solution { |
| 151 | +public: |
| 152 | + const int mod = 1e9 + 7; |
| 153 | + |
| 154 | + int numberOfWays(string corridor) { |
| 155 | + int n = corridor.size(); |
| 156 | + vector<vector<int>> f(n, vector<int>(3, -1)); |
| 157 | + function<int(int, int)> dfs; |
| 158 | + dfs = [&](int i, int cnt) { |
| 159 | + if (i == n) return cnt == 2 ? 1 : 0; |
| 160 | + cnt += corridor[i] == 'S'; |
| 161 | + if (cnt > 2) return 0; |
| 162 | + if (f[i][cnt] != -1) return f[i][cnt]; |
| 163 | + int ans = dfs(i + 1, cnt); |
| 164 | + if (cnt == 2) { |
| 165 | + ans += dfs(i + 1, 0); |
| 166 | + ans %= mod; |
| 167 | + } |
| 168 | + f[i][cnt] = ans; |
| 169 | + return ans; |
| 170 | + }; |
| 171 | + return dfs(0, 0); |
| 172 | + } |
| 173 | +}; |
79 | 174 | ```
|
80 | 175 |
|
81 |
| -### **TypeScript** |
| 176 | +### **Go** |
| 177 | + |
| 178 | +```go |
| 179 | +func numberOfWays(corridor string) int { |
| 180 | + n := len(corridor) |
| 181 | + var mod int = 1e9 + 7 |
| 182 | + f := make([][]int, n) |
| 183 | + for i := range f { |
| 184 | + f[i] = make([]int, 3) |
| 185 | + for j := range f[i] { |
| 186 | + f[i][j] = -1 |
| 187 | + } |
| 188 | + } |
| 189 | + var dfs func(i, cnt int) int |
| 190 | + dfs = func(i, cnt int) int { |
| 191 | + if i == n { |
| 192 | + if cnt == 2 { |
| 193 | + return 1 |
| 194 | + } |
| 195 | + return 0 |
| 196 | + } |
| 197 | + if corridor[i] == 'S' { |
| 198 | + cnt++ |
| 199 | + } |
| 200 | + if cnt > 2 { |
| 201 | + return 0 |
| 202 | + } |
| 203 | + if f[i][cnt] != -1 { |
| 204 | + return f[i][cnt] |
| 205 | + } |
| 206 | + ans := dfs(i+1, cnt) |
| 207 | + if cnt == 2 { |
| 208 | + ans += dfs(i+1, 0) |
| 209 | + ans %= mod |
| 210 | + } |
| 211 | + f[i][cnt] = ans |
| 212 | + return ans |
| 213 | + } |
| 214 | + return dfs(0, 0) |
| 215 | +} |
| 216 | +``` |
82 | 217 |
|
83 |
| -<!-- 这里可写当前语言的特殊实现逻辑 --> |
| 218 | +### **TypeScript** |
84 | 219 |
|
85 | 220 | ```ts
|
86 | 221 |
|
|
0 commit comments