74
74
75
75
** 方法一:模拟**
76
76
77
- 根据题意模拟即可 。
77
+ 我们将字符串按照空格分割成单词,然后判断每个单词的最后一个字符和下一个单词的第一个字符是否相等,如果不相等则返回 ` false ` ,否则遍历完所有单词后返回 ` true ` 。
78
78
79
79
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串的长度。
80
80
81
+ ** 方法二:模拟(空间优化)**
82
+
83
+ 我们可以先判断字符串的第一个字符和最后一个字符是否相等,如果不相等则返回 ` false ` ,否则遍历字符串,如果当前字符是空格,则判断前一个字符和后一个字符是否相等,如果不相等则返回 ` false ` ,否则遍历完所有字符后返回 ` true ` 。
84
+
85
+ 时间复杂度 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度 $O(1)$。
86
+
81
87
<!-- tabs:start -->
82
88
83
89
### ** Python3**
87
93
``` python
88
94
class Solution :
89
95
def isCircularSentence (self , sentence : str ) -> bool :
90
- sentence = sentence.split()
91
- return all (s[0 ] == sentence[i - 1 ][- 1 ] for i, s in enumerate (sentence))
96
+ ss = sentence.split()
97
+ n = len (ss)
98
+ return all (s[- 1 ] == ss[(i + 1 ) % n][0 ] for i, s in enumerate (ss))
99
+ ```
100
+
101
+ ``` python
102
+ class Solution :
103
+ def isCircularSentence (self , s : str ) -> bool :
104
+ return s[0 ] == s[- 1 ] and all (
105
+ c != " " or s[i - 1 ] == s[i + 1 ] for i, c in enumerate (s)
106
+ )
92
107
```
93
108
94
109
### ** Java**
@@ -98,12 +113,27 @@ class Solution:
98
113
``` java
99
114
class Solution {
100
115
public boolean isCircularSentence (String sentence ) {
101
- if (sentence. charAt(0 ) != sentence. charAt(sentence. length() - 1 )) {
116
+ var ss = sentence. split(" " );
117
+ int n = ss. length;
118
+ for (int i = 0 ; i < n; ++ i) {
119
+ if (ss[i]. charAt(ss[i]. length() - 1 ) != ss[(i + 1 ) % n]. charAt(0 )) {
120
+ return false ;
121
+ }
122
+ }
123
+ return true ;
124
+ }
125
+ }
126
+ ```
127
+
128
+ ``` java
129
+ class Solution {
130
+ public boolean isCircularSentence (String s ) {
131
+ int n = s. length();
132
+ if (s. charAt(0 ) != s. charAt(n - 1 )) {
102
133
return false ;
103
134
}
104
- String [] ss = sentence. split(" " );
105
- for (int i = 1 ; i < ss. length; ++ i) {
106
- if (ss[i]. charAt(0 ) != ss[i - 1 ]. charAt(ss[i - 1 ]. length() - 1 )) {
135
+ for (int i = 1 ; i < n; ++ i) {
136
+ if (s. charAt(i) == ' ' && s. charAt(i - 1 ) != s. charAt(i + 1 )) {
107
137
return false ;
108
138
}
109
139
}
@@ -118,13 +148,38 @@ class Solution {
118
148
class Solution {
119
149
public:
120
150
bool isCircularSentence(string sentence) {
121
- if (sentence[ 0] != sentence[ sentence.size() - 1] ) return false;
122
- istringstream is(sentence);
123
- vector<string > ss;
124
- string s;
125
- while (is >> s) ss.emplace_back(s);
126
- for (int i = 1; i < ss.size(); ++i) {
127
- if (ss[ i] [ 0 ] != ss[ i - 1] [ ss[ i - 1] .size() - 1] ) {
151
+ auto ss = split(sentence, ' ');
152
+ int n = ss.size();
153
+ for (int i = 0; i < n; ++i) {
154
+ if (ss[ i] .back() != ss[ (i + 1) % n] [ 0 ] ) {
155
+ return false;
156
+ }
157
+ }
158
+ return true;
159
+ }
160
+
161
+ vector<string> split(string& s, char delim) {
162
+ stringstream ss(s);
163
+ string item;
164
+ vector<string> res;
165
+ while (getline(ss, item, delim)) {
166
+ res.emplace_back(item);
167
+ }
168
+ return res;
169
+ }
170
+ };
171
+ ```
172
+
173
+ ``` cpp
174
+ class Solution {
175
+ public:
176
+ bool isCircularSentence(string s) {
177
+ int n = s.size();
178
+ if (s[ 0] != s.back()) {
179
+ return false;
180
+ }
181
+ for (int i = 1; i < n; ++i) {
182
+ if (s[ i] == ' ' && s[ i - 1] != s[ i + 1] ) {
128
183
return false;
129
184
}
130
185
}
@@ -137,12 +192,25 @@ public:
137
192
138
193
```go
139
194
func isCircularSentence(sentence string) bool {
140
- if sentence[0] != sentence[len(sentence)-1] {
195
+ ss := strings.Split(sentence, " ")
196
+ n := len(ss)
197
+ for i, s := range ss {
198
+ if s[len(s)-1] != ss[(i+1)%n][0] {
199
+ return false
200
+ }
201
+ }
202
+ return true
203
+ }
204
+ ```
205
+
206
+ ``` go
207
+ func isCircularSentence (s string ) bool {
208
+ n := len (s)
209
+ if s[0 ] != s[n-1 ] {
141
210
return false
142
211
}
143
- ss := strings.Split(sentence, " ")
144
- for i := 1; i < len(ss); i++ {
145
- if ss[i][0] != ss[i-1][len(ss[i-1])-1] {
212
+ for i := 1 ; i < n; i++ {
213
+ if s[i] == ' ' && s[i-1 ] != s[i+1 ] {
146
214
return false
147
215
}
148
216
}
@@ -153,19 +221,38 @@ func isCircularSentence(sentence string) bool {
153
221
### ** JavaScript**
154
222
155
223
``` js
224
+ /**
225
+ * @param {string} sentence
226
+ * @return {boolean}
227
+ */
156
228
var isCircularSentence = function (sentence ) {
157
- const words = sentence .split (' ' );
158
- const post = words[0 ].charCodeAt (0 );
159
- let prev = words[0 ].charCodeAt (words[0 ].length - 1 );
160
- const n = words .length ;
161
- for (let i = 1 ; i < n; i++ ) {
162
- let cur = words[i];
163
- if (cur .charCodeAt (0 ) !== prev) {
229
+ const ss = sentence .split (' ' );
230
+ const n = ss .length ;
231
+ for (let i = 0 ; i < n; ++ i) {
232
+ if (ss[i][ss[i].length - 1 ] !== ss[(i + 1 ) % n][0 ]) {
164
233
return false ;
165
234
}
166
- prev = cur .charCodeAt (cur .length - 1 );
167
235
}
168
- return post === prev;
236
+ return true ;
237
+ };
238
+ ```
239
+
240
+ ``` js
241
+ /**
242
+ * @param {string} s
243
+ * @return {boolean}
244
+ */
245
+ var isCircularSentence = function (s ) {
246
+ const n = s .length ;
247
+ if (s[0 ] !== s[n - 1 ]) {
248
+ return false ;
249
+ }
250
+ for (let i = 1 ; i < n; ++ i) {
251
+ if (s[i] === ' ' && s[i - 1 ] !== s[i + 1 ]) {
252
+ return false ;
253
+ }
254
+ }
255
+ return true ;
169
256
};
170
257
```
171
258
@@ -175,11 +262,23 @@ var isCircularSentence = function (sentence) {
175
262
function isCircularSentence(sentence : string ): boolean {
176
263
const ss = sentence .split (' ' );
177
264
const n = ss .length ;
178
- if (ss [0 ][0 ] !== ss [n - 1 ][ss [n - 1 ].length - 1 ]) {
265
+ for (let i = 0 ; i < n ; ++ i ) {
266
+ if (ss [i ][ss [i ].length - 1 ] !== ss [(i + 1 ) % n ][0 ]) {
267
+ return false ;
268
+ }
269
+ }
270
+ return true ;
271
+ }
272
+ ```
273
+
274
+ ``` ts
275
+ function isCircularSentence(s : string ): boolean {
276
+ const n = s .length ;
277
+ if (s [0 ] !== s [n - 1 ]) {
179
278
return false ;
180
279
}
181
- for (let i = 0 ; i < n - 1 ; i ++ ) {
182
- if (ss [i ][ ss [ i ]. length - 1 ] !== ss [i + 1 ][ 0 ]) {
280
+ for (let i = 1 ; i < n ; ++ i ) {
281
+ if (s [i ] === ' ' && s [ i - 1 ] !== s [i + 1 ]) {
183
282
return false ;
184
283
}
185
284
}
@@ -194,11 +293,8 @@ impl Solution {
194
293
pub fn is_circular_sentence (sentence : String ) -> bool {
195
294
let ss : Vec <String > = sentence . split (' ' ). map (String :: from ). collect ();
196
295
let n = ss . len ();
197
- if ss [0 ]. as_bytes ()[0 ] != ss [n - 1 ]. as_bytes ()[ss [n - 1 ]. len () - 1 ] {
198
- return false ;
199
- }
200
- for i in 1 .. n {
201
- if ss [i - 1 ]. as_bytes ()[ss [i - 1 ]. len () - 1 ] != ss [i ]. as_bytes ()[0 ] {
296
+ for i in 0 .. n {
297
+ if ss [i ]. as_bytes ()[ss [i ]. len () - 1 ] != ss [(i + 1 ) % n ]. as_bytes ()[0 ] {
202
298
return false ;
203
299
}
204
300
}
0 commit comments