
题目描述
给你一个字符串 word
和一个整数 numFriends
。
Alice 正在为她的 numFriends
位朋友组织一个游戏。游戏分为多个回合,在每一回合中:
word
被分割成 numFriends
个 非空 字符串,且该分割方式与之前的任意回合所采用的都 不完全相同 。
- 所有分割出的字符串都会被放入一个盒子中。
在所有回合结束后,找出盒子中 字典序最大的 字符串。
字符串 a
的字典序 小于 字符串 b
的前提是:在两个字符串上第一处不同的位置上,a
的字母在字母表中的顺序早于 b
中对应的字母。
如果前 min(a.length, b.length)
个字符都相同,那么较短的字符串字典序更小。
示例 1:
输入: word = "dbca", numFriends = 2
输出: "dbc"
解释:
所有可能的分割方式为:
"d"
和 "bca"
。
"db"
和 "ca"
。
"dbc"
和 "a"
。
示例 2:
输入: word = "gggg", numFriends = 4
输出: "g"
解释:
唯一可能的分割方式为:"g"
, "g"
, "g"
, 和 "g"
。
提示:
1 <= word.length <= 2 * 105
word
仅由小写英文字母组成。
1 <= numFriends <= word.length
解法
方法一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | class Solution:
def answerString(self, word: str, numFriends: int) -> str:
if numFriends == 1:
return word
s = self.lastSubstring(word)
return s[: len(word) - numFriends + 1]
def lastSubstring(self, s: str) -> str:
i, j, k = 0, 1, 0
while j + k < len(s):
if s[i + k] == s[j + k]:
k += 1
elif s[i + k] < s[j + k]:
i += k + 1
k = 0
if i >= j:
j = i + 1
else:
j += k + 1
k = 0
return s[i:]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | class Solution {
public String answerString(String word, int numFriends) {
if (numFriends == 1) {
return word;
}
String s = lastSubstring(word);
return s.substring(0, Math.min(s.length(), word.length() - numFriends + 1));
}
public String lastSubstring(String s) {
int n = s.length();
int i = 0, j = 1, k = 0;
while (j + k < n) {
int d = s.charAt(i + k) - s.charAt(j + k);
if (d == 0) {
++k;
} else if (d < 0) {
i += k + 1;
k = 0;
if (i >= j) {
j = i + 1;
}
} else {
j += k + 1;
k = 0;
}
}
return s.substring(i);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | class Solution {
public:
string answerString(string word, int numFriends) {
if (numFriends == 1) {
return word;
}
string s = lastSubstring(word);
return s.substr(0, min(s.length(), word.length() - numFriends + 1));
}
string lastSubstring(string& s) {
int n = s.size();
int i = 0, j = 1, k = 0;
while (j + k < n) {
if (s[i + k] == s[j + k]) {
++k;
} else if (s[i + k] < s[j + k]) {
i += k + 1;
k = 0;
if (i >= j) {
j = i + 1;
}
} else {
j += k + 1;
k = 0;
}
}
return s.substr(i);
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | func answerString(word string, numFriends int) string {
if numFriends == 1 {
return word
}
s := lastSubstring(word)
return s[:min(len(s), len(word)-numFriends+1)]
}
func lastSubstring(s string) string {
n := len(s)
i, j, k := 0, 1, 0
for j+k < n {
if s[i+k] == s[j+k] {
k++
} else if s[i+k] < s[j+k] {
i += k + 1
k = 0
if i >= j {
j = i + 1
}
} else {
j += k + 1
k = 0
}
}
return s[i:]
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | function answerString(word: string, numFriends: number): string {
if (numFriends === 1) {
return word;
}
const s = lastSubstring(word);
return s.slice(0, word.length - numFriends + 1);
}
function lastSubstring(s: string): string {
const n = s.length;
let i = 0;
for (let j = 1, k = 0; j + k < n; ) {
if (s[i + k] === s[j + k]) {
++k;
} else if (s[i + k] < s[j + k]) {
i += k + 1;
k = 0;
if (i >= j) {
j = i + 1;
}
} else {
j += k + 1;
k = 0;
}
}
return s.slice(i);
}
|