跳转至

3403. 从盒子中找出字典序最大的字符串 I

题目描述

给你一个字符串 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

解法

方法一

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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;
}

评论