题目描述
给你一个字符串 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 <= 5 * 103
word
仅由小写英文字母组成。
1 <= numFriends <= word.length
解法
方法一
| class Solution:
def answerString(self, word: str, numFriends: int) -> str:
if numFriends == 1:
return word
n = len(word)
ans = ""
for i in range(n):
k = min(n - i, n - numFriends + 1)
ans = max(ans, word[i : i + k])
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | class Solution {
public String answerString(String word, int numFriends) {
if (numFriends == 1) {
return word;
}
int n = word.length();
String ans = "";
for (int i = 0; i < n; ++i) {
int k = Math.min(n - i, n - numFriends + 1);
String t = word.substring(i, i + k);
if (ans.compareTo(t) < 0) {
ans = t;
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | class Solution {
public:
string answerString(string word, int numFriends) {
if (numFriends == 1) {
return word;
}
int n = word.size();
string ans;
for (int i = 0; i < n; ++i) {
int k = min(n - i, n - numFriends + 1);
string t = word.substr(i, k);
ans = max(ans, t);
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12 | func answerString(word string, numFriends int) (ans string) {
if numFriends == 1 {
return word
}
n := len(word)
for i := range word {
k := min(n-i, n-numFriends+1)
t := word[i : i+k]
ans = max(ans, t)
}
return
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | function answerString(word: string, numFriends: number): string {
if (numFriends === 1) {
return word;
}
let ans: string = '';
const n = word.length;
for (let i = 0; i < n; ++i) {
const k = Math.min(n - i, n - numFriends + 1);
const t = word.slice(i, i + k);
if (ans < t) {
ans = t;
}
}
return ans;
}
|