
题目描述
给你一个字符串 word 和一个整数 numFriends。
Alice 正在为她的 numFriends 位朋友组织一个游戏。游戏分为多个回合,在每一回合中:
    word 被分割成 numFriends 个 非空 字符串,且该分割方式与之前的任意回合所采用的都 不完全相同 。 
    - 所有分割出的字符串都会被放入一个盒子中。
 
在所有回合结束后,找出盒子中 字典序最大的 字符串。
 
示例 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 
解法
方法一:枚举子串左端点
如果我们固定子字符串的左端点,那么子字符串越长,字典序越大。假设子字符串左端点为 \(i\),剩余子字符串的最小长度为 \(\text{numFriends} - 1\),那么子字符串的右端点可以取到 \(\min(n, i + n - (\text{numFriends} - 1))\),其中 \(n\) 为字符串的长度。注意我们说的是左开右闭。
我们枚举所有可能的左端点,取出对应的子字符串,比较字典序,最终得到字典序最大的子字符串。
时间复杂度 \(O(n^2)\),空间复杂度 \(O(n)\)。其中 \(n\) 为字符串的长度。
 | class Solution:
    def answerString(self, word: str, numFriends: int) -> str:
        if numFriends == 1:
            return word
        n = len(word)
        return max(word[i : i + n - (numFriends - 1)] for i in range(n))
  | 
 
 
 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.length();
        String ans = "";
        for (int i = 0; i < n; ++i) {
            String t = word.substring(i, Math.min(n, i + n - (numFriends - 1)));
            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
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) {
            string t = word.substr(i, min(n - i, n - (numFriends - 1)));
            if (ans < t) {
                ans = t;
            }
        }
        return ans;
    }
};
  | 
 
 
 | func answerString(word string, numFriends int) (ans string) {
    if numFriends == 1 {
        return word
    }
    n := len(word)
    for i := 0; i < n; i++ {
        t := word[i:min(n, i+n-(numFriends-1))]
        ans = max(ans, t)
    }
    return
}
  | 
 
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12  | function answerString(word: string, numFriends: number): string {
    if (numFriends === 1) {
        return word;
    }
    const n = word.length;
    let ans = '';
    for (let i = 0; i < n; i++) {
        const t = word.slice(i, Math.min(n, i + n - (numFriends - 1)));
        ans = t > ans ? t : ans;
    }
    return ans;
}
  |