We need to find the lexicographically largest substring that can result from splitting word into numFriends non-empty parts.
Lexicographical order is the same as dictionary order: for example, “bc” > “ab” because “b” comes after “a”, and “abcd” > “abc” since it has an extra character at the end.
This means we should look for the longest possible substring after making the required splits.
Since the string is divided into numFriends parts, the longest substring possible is of length word.length() - numFriends + 1.
To solve this, we can check all substrings of lengths from 1 up to word.length() - numFriends + 1 and return the largest one in lexicographical order.
classSolution {
public: string answerString(string word, int numFriends) {
if (numFriends ==1) return word;
int n = word.size();
string ans ="";
int maxLen = n - numFriends +1;
for (int i =0; i < n; ++i) {
string sub;
if (i + maxLen <= n)
sub = word.substr(i, maxLen);
else sub = word.substr(i);
if (sub > ans)
ans = sub;
}
return ans;
}
};
typeSolutionstruct{}
func (Solution) AnswerString(wordstring, numFriendsint) string {
ifnumFriends==1 {
returnword }
n:= len(word)
ans:=""maxLen:=n-numFriends+1fori:=0; i < n; i++ {
varsubstringifi+maxLen<=n {
sub = word[i : i+maxLen]
} else {
sub = word[i:]
}
ifsub > ans {
ans = sub }
}
returnans}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
public String answerString(String word, int numFriends) {
if (numFriends == 1) return word;
int n = word.length();
String ans ="";
int maxLen = n - numFriends + 1;
for (int i = 0; i < n; i++) {
String sub;
if (i + maxLen <= n)
sub = word.substring(i, i + maxLen);
else sub = word.substring(i);
if (sub.compareTo(ans) > 0)
ans = sub;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution {
funanswerString(word: String, numFriends: Int): String {
if (numFriends ==1) return word
val n = word.length
var ans = ""val maxLen = n - numFriends + 1for (i in0 until n) {
val sub = if (i + maxLen <= n) word.substring(i, i + maxLen) else word.substring(i)
if (sub > ans) ans = sub
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defanswerString(self, word: str, numFriends: int) -> str:
if numFriends ==1:
return word
n = len(word)
ans ="" maxLen = n - numFriends +1for i in range(n):
if i + maxLen <= n:
sub = word[i:i+maxLen]
else:
sub = word[i:]
if sub > ans:
ans = sub
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
impl Solution {
pubfnanswer_string(word: String, num_friends: i32) -> String {
if num_friends ==1 {
return word;
}
let n = word.len();
let max_len = n - num_friends asusize+1;
let bytes = word.as_bytes();
letmut ans ="";
for i in0..n {
let end =if i + max_len <= n { i + max_len } else { n };
let sub =&word[i..end];
if sub > ans {
ans = sub;
}
}
ans.to_string()
}
}