Skip to content

Commit c5e9483

Browse files
authored
feat: add solutions to lc problem: No.2490 (doocs#1046)
No.2490.Circular Sentence
1 parent e605c0c commit c5e9483

File tree

9 files changed

+321
-137
lines changed

9 files changed

+321
-137
lines changed

solution/2400-2499/2490.Circular Sentence/README.md

+131-35
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,16 @@
7474

7575
**方法一:模拟**
7676

77-
根据题意模拟即可
77+
我们将字符串按照空格分割成单词,然后判断每个单词的最后一个字符和下一个单词的第一个字符是否相等,如果不相等则返回 `false`,否则遍历完所有单词后返回 `true`
7878

7979
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串的长度。
8080

81+
**方法二:模拟(空间优化)**
82+
83+
我们可以先判断字符串的第一个字符和最后一个字符是否相等,如果不相等则返回 `false`,否则遍历字符串,如果当前字符是空格,则判断前一个字符和后一个字符是否相等,如果不相等则返回 `false`,否则遍历完所有字符后返回 `true`
84+
85+
时间复杂度 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度 $O(1)$。
86+
8187
<!-- tabs:start -->
8288

8389
### **Python3**
@@ -87,8 +93,17 @@
8793
```python
8894
class Solution:
8995
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+
)
92107
```
93108

94109
### **Java**
@@ -98,12 +113,27 @@ class Solution:
98113
```java
99114
class Solution {
100115
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)) {
102133
return false;
103134
}
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)) {
107137
return false;
108138
}
109139
}
@@ -118,13 +148,38 @@ class Solution {
118148
class Solution {
119149
public:
120150
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]) {
128183
return false;
129184
}
130185
}
@@ -137,12 +192,25 @@ public:
137192
138193
```go
139194
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] {
141210
return false
142211
}
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] {
146214
return false
147215
}
148216
}
@@ -153,19 +221,38 @@ func isCircularSentence(sentence string) bool {
153221
### **JavaScript**
154222

155223
```js
224+
/**
225+
* @param {string} sentence
226+
* @return {boolean}
227+
*/
156228
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]) {
164233
return false;
165234
}
166-
prev = cur.charCodeAt(cur.length - 1);
167235
}
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;
169256
};
170257
```
171258

@@ -175,11 +262,23 @@ var isCircularSentence = function (sentence) {
175262
function isCircularSentence(sentence: string): boolean {
176263
const ss = sentence.split(' ');
177264
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]) {
179278
return false;
180279
}
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]) {
183282
return false;
184283
}
185284
}
@@ -194,11 +293,8 @@ impl Solution {
194293
pub fn is_circular_sentence(sentence: String) -> bool {
195294
let ss: Vec<String> = sentence.split(' ').map(String::from).collect();
196295
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] {
202298
return false;
203299
}
204300
}

0 commit comments

Comments
 (0)