Skip to content

Commit abb1631

Browse files
committedFeb 13, 2023
feat: add solutions to lc problem: No.0555
No.0555.Split Concatenated Strings
1 parent b46bbe1 commit abb1631

File tree

6 files changed

+400
-2
lines changed

6 files changed

+400
-2
lines changed
 

‎solution/0500-0599/0555.Split Concatenated Strings/README.md

+143-1
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,164 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53+
**方法一:贪心**
54+
55+
我们先遍历字符串数组 `strs`,对于每个字符串 $s$,如果 $s$ 的反转字符串 $t$ 比 $s$ 大,那么我们就将 $s$ 替换为 $t$。
56+
57+
然后我们再枚举字符串数组 `strs` 的每个位置 $i$ 作为分割点,将字符串数组 `strs` 拆成两部分,分别为 $strs[i + 1:]$ 和 $strs[:i]$,然后将这两部分拼接起来,得到一个新的字符串 $t$。接下来,我们枚举当前字符串 $strs[i]$ 的每个位置 $j$,其后缀部分为 $a=strs[i][j:]$,前缀部分为 $b=strs[i][:j]$,那么我们可以将 $a$、$t$ 和 $b$ 拼接起来,得到一个新的字符串 $cur$,如果 $cur$ 比当前答案大,那么我们就更新答案。这是将 $strs[i]$ 翻转后的情况,我们还需要考虑 $strs[i]$ 不翻转的情况,即将 $a$、$t$ 和 $b$ 的顺序反过来拼接,得到一个新的字符串 $cur$,如果 $cur$ 比当前答案大,那么我们就更新答案。
58+
59+
最后,我们返回答案即可。
60+
61+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为字符串数组 `strs` 的长度。
62+
5363
<!-- tabs:start -->
5464

5565
### **Python3**
5666

5767
<!-- 这里可写当前语言的特殊实现逻辑 -->
5868

5969
```python
60-
70+
class Solution:
71+
def splitLoopedString(self, strs: List[str]) -> str:
72+
strs = [s[::-1] if s[::-1] > s else s for s in strs]
73+
ans = ''.join(strs)
74+
for i, s in enumerate(strs):
75+
t = ''.join(strs[i + 1:]) + ''.join(strs[: i])
76+
for j in range(len(s)):
77+
a = s[j:]
78+
b = s[:j]
79+
ans = max(ans, a + t + b)
80+
ans = max(ans, b[::-1] + t + a[::-1])
81+
return ans
6182
```
6283

6384
### **Java**
6485

6586
<!-- 这里可写当前语言的特殊实现逻辑 -->
6687

6788
```java
89+
class Solution {
90+
public String splitLoopedString(String[] strs) {
91+
int n = strs.length;
92+
for (int i = 0; i < n; ++i) {
93+
String s = strs[i];
94+
String t = new StringBuilder(s).reverse().toString();
95+
if (s.compareTo(t) < 0) {
96+
strs[i] = t;
97+
}
98+
}
99+
String ans = "";
100+
for (int i = 0; i < n; ++i) {
101+
String s = strs[i];
102+
StringBuilder sb = new StringBuilder();
103+
for (int j = i + 1; j < n; ++j) {
104+
sb.append(strs[j]);
105+
}
106+
for (int j = 0; j < i; ++j) {
107+
sb.append(strs[j]);
108+
}
109+
String t = sb.toString();
110+
for (int j = 0; j < s.length(); ++j) {
111+
String a = s.substring(j);
112+
String b = s.substring(0, j);
113+
String cur = a + t + b;
114+
if (ans.compareTo(cur) < 0) {
115+
ans = cur;
116+
}
117+
cur = new StringBuilder(b).reverse().append(t)
118+
.append(new StringBuilder(a).reverse().toString()).toString();
119+
if (ans.compareTo(cur) < 0) {
120+
ans = cur;
121+
}
122+
}
123+
}
124+
return ans;
125+
}
126+
}
127+
```
128+
129+
### **C++**
130+
131+
```cpp
132+
class Solution {
133+
public:
134+
string splitLoopedString(vector<string>& strs) {
135+
for (auto& s : strs) {
136+
string t{s.rbegin(), s.rend()};
137+
s = max(s, t);
138+
}
139+
int n = strs.size();
140+
string ans = "";
141+
for (int i = 0; i < strs.size(); ++i) {
142+
auto& s = strs[i];
143+
string t;
144+
for (int j = i + 1; j < n; ++j) {
145+
t += strs[j];
146+
}
147+
for (int j = 0; j < i; ++j) {
148+
t += strs[j];
149+
}
150+
for (int j = 0; j < s.size(); ++j) {
151+
auto a = s.substr(j);
152+
auto b = s.substr(0, j);
153+
auto cur = a + t + b;
154+
if (ans < cur) {
155+
ans = cur;
156+
}
157+
reverse(a.begin(), a.end());
158+
reverse(b.begin(), b.end());
159+
cur = b + t + a;
160+
if (ans < cur) {
161+
ans = cur;
162+
}
163+
}
164+
}
165+
return ans;
166+
}
167+
};
168+
```
68169
170+
### **Go**
171+
172+
```go
173+
func splitLoopedString(strs []string) (ans string) {
174+
for i, s := range strs {
175+
t := reverse(s)
176+
if s < t {
177+
strs[i] = t
178+
}
179+
}
180+
for i, s := range strs {
181+
sb := &strings.Builder{}
182+
for _, w := range strs[i+1:] {
183+
sb.WriteString(w)
184+
}
185+
for _, w := range strs[:i] {
186+
sb.WriteString(w)
187+
}
188+
t := sb.String()
189+
for j := 0; j < len(s); j++ {
190+
a, b := s[j:], s[0:j]
191+
cur := a + t + b
192+
if ans < cur {
193+
ans = cur
194+
}
195+
cur = reverse(b) + t + reverse(a)
196+
if ans < cur {
197+
ans = cur
198+
}
199+
}
200+
}
201+
return ans
202+
}
203+
204+
func reverse(s string) string {
205+
t := []byte(s)
206+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
207+
t[i], t[j] = t[j], t[i]
208+
}
209+
return string(t)
210+
}
69211
```
70212

71213
### **...**

‎solution/0500-0599/0555.Split Concatenated Strings/README_EN.md

+133-1
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,145 @@ The answer string came from the fourth looped one, where you could cut from the
5151
### **Python3**
5252

5353
```python
54-
54+
class Solution:
55+
def splitLoopedString(self, strs: List[str]) -> str:
56+
strs = [s[::-1] if s[::-1] > s else s for s in strs]
57+
ans = ''.join(strs)
58+
for i, s in enumerate(strs):
59+
t = ''.join(strs[i + 1:]) + ''.join(strs[: i])
60+
for j in range(len(s)):
61+
a = s[j:]
62+
b = s[:j]
63+
ans = max(ans, a + t + b)
64+
ans = max(ans, b[::-1] + t + a[::-1])
65+
return ans
5566
```
5667

5768
### **Java**
5869

5970
```java
71+
class Solution {
72+
public String splitLoopedString(String[] strs) {
73+
int n = strs.length;
74+
for (int i = 0; i < n; ++i) {
75+
String s = strs[i];
76+
String t = new StringBuilder(s).reverse().toString();
77+
if (s.compareTo(t) < 0) {
78+
strs[i] = t;
79+
}
80+
}
81+
String ans = "";
82+
for (int i = 0; i < n; ++i) {
83+
String s = strs[i];
84+
StringBuilder sb = new StringBuilder();
85+
for (int j = i + 1; j < n; ++j) {
86+
sb.append(strs[j]);
87+
}
88+
for (int j = 0; j < i; ++j) {
89+
sb.append(strs[j]);
90+
}
91+
String t = sb.toString();
92+
for (int j = 0; j < s.length(); ++j) {
93+
String a = s.substring(j);
94+
String b = s.substring(0, j);
95+
String cur = a + t + b;
96+
if (ans.compareTo(cur) < 0) {
97+
ans = cur;
98+
}
99+
cur = new StringBuilder(b).reverse().append(t)
100+
.append(new StringBuilder(a).reverse().toString()).toString();
101+
if (ans.compareTo(cur) < 0) {
102+
ans = cur;
103+
}
104+
}
105+
}
106+
return ans;
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
string splitLoopedString(vector<string>& strs) {
117+
for (auto& s : strs) {
118+
string t{s.rbegin(), s.rend()};
119+
s = max(s, t);
120+
}
121+
int n = strs.size();
122+
string ans = "";
123+
for (int i = 0; i < strs.size(); ++i) {
124+
auto& s = strs[i];
125+
string t;
126+
for (int j = i + 1; j < n; ++j) {
127+
t += strs[j];
128+
}
129+
for (int j = 0; j < i; ++j) {
130+
t += strs[j];
131+
}
132+
for (int j = 0; j < s.size(); ++j) {
133+
auto a = s.substr(j);
134+
auto b = s.substr(0, j);
135+
auto cur = a + t + b;
136+
if (ans < cur) {
137+
ans = cur;
138+
}
139+
reverse(a.begin(), a.end());
140+
reverse(b.begin(), b.end());
141+
cur = b + t + a;
142+
if (ans < cur) {
143+
ans = cur;
144+
}
145+
}
146+
}
147+
return ans;
148+
}
149+
};
150+
```
60151
152+
### **Go**
153+
154+
```go
155+
func splitLoopedString(strs []string) (ans string) {
156+
for i, s := range strs {
157+
t := reverse(s)
158+
if s < t {
159+
strs[i] = t
160+
}
161+
}
162+
for i, s := range strs {
163+
sb := &strings.Builder{}
164+
for _, w := range strs[i+1:] {
165+
sb.WriteString(w)
166+
}
167+
for _, w := range strs[:i] {
168+
sb.WriteString(w)
169+
}
170+
t := sb.String()
171+
for j := 0; j < len(s); j++ {
172+
a, b := s[j:], s[0:j]
173+
cur := a + t + b
174+
if ans < cur {
175+
ans = cur
176+
}
177+
cur = reverse(b) + t + reverse(a)
178+
if ans < cur {
179+
ans = cur
180+
}
181+
}
182+
}
183+
return ans
184+
}
185+
186+
func reverse(s string) string {
187+
t := []byte(s)
188+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
189+
t[i], t[j] = t[j], t[i]
190+
}
191+
return string(t)
192+
}
61193
```
62194

63195
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
public:
3+
string splitLoopedString(vector<string>& strs) {
4+
for (auto& s : strs) {
5+
string t{s.rbegin(), s.rend()};
6+
s = max(s, t);
7+
}
8+
int n = strs.size();
9+
string ans = "";
10+
for (int i = 0; i < strs.size(); ++i) {
11+
auto& s = strs[i];
12+
string t;
13+
for (int j = i + 1; j < n; ++j) {
14+
t += strs[j];
15+
}
16+
for (int j = 0; j < i; ++j) {
17+
t += strs[j];
18+
}
19+
for (int j = 0; j < s.size(); ++j) {
20+
auto a = s.substr(j);
21+
auto b = s.substr(0, j);
22+
auto cur = a + t + b;
23+
if (ans < cur) {
24+
ans = cur;
25+
}
26+
reverse(a.begin(), a.end());
27+
reverse(b.begin(), b.end());
28+
cur = b + t + a;
29+
if (ans < cur) {
30+
ans = cur;
31+
}
32+
}
33+
}
34+
return ans;
35+
}
36+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
func splitLoopedString(strs []string) (ans string) {
2+
for i, s := range strs {
3+
t := reverse(s)
4+
if s < t {
5+
strs[i] = t
6+
}
7+
}
8+
for i, s := range strs {
9+
sb := &strings.Builder{}
10+
for _, w := range strs[i+1:] {
11+
sb.WriteString(w)
12+
}
13+
for _, w := range strs[:i] {
14+
sb.WriteString(w)
15+
}
16+
t := sb.String()
17+
for j := 0; j < len(s); j++ {
18+
a, b := s[j:], s[0:j]
19+
cur := a + t + b
20+
if ans < cur {
21+
ans = cur
22+
}
23+
cur = reverse(b) + t + reverse(a)
24+
if ans < cur {
25+
ans = cur
26+
}
27+
}
28+
}
29+
return ans
30+
}
31+
32+
func reverse(s string) string {
33+
t := []byte(s)
34+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
35+
t[i], t[j] = t[j], t[i]
36+
}
37+
return string(t)
38+
}

0 commit comments

Comments
 (0)
Please sign in to comment.