Easy
题目描述
给你一个字符串 num,表示一个大整数。如果一个整数满足下述所有条件,则认为该整数是一个 好整数 :
- 它是
num的一个长度为 3 的 子字符串。 - 它由唯一的一个数字组成。
返回 最大的好整数 作为 字符串,如果不存在满足条件的整数,则返回一个空字符串 ""。
注意:
- 子字符串 是字符串中连续的字符序列。
num或好整数中可能有 前导零。
示例 1:
输入:num = "6777133339"
输出:"777"
解释:num 中存在两个不同的好整数:"777" 和 "333" 。
"777" 是最大的,所以返回 "777" 。
示例 2:
输入:num = "2300019"
输出:"000"
解释:"000" 是唯一的好整数。
示例 3:
输入:num = "42352338"
输出:""
解释:不存在长度为 3 且由唯一数字组成的子字符串。因此,不存在好整数。
提示:
3 <= num.length <= 1000num只由数字组成。
解题思路
这道题要求找到字符串中最大的3位相同数字。我们需要找到所有由相同数字组成的长度为3的子字符串,然后返回其中最大的一个。
有两种主要解法:
解法一:贪心法(推荐) 由于题目要求最大的好整数,我们可以按照从大到小的顺序检查 “999”、“888”、“777”、…、“000” 是否在字符串中出现。第一个找到的就是答案,这样可以保证结果是最大的。
解法二:遍历法 遍历整个字符串,检查每个长度为3的子字符串是否由相同数字组成。记录所有满足条件的子字符串,然后返回其中最大的一个。
贪心法更高效,因为一旦找到就可以立即返回,避免了不必要的遍历。而遍历法需要检查所有可能的子字符串。
两种方法的时间复杂度都不错,但贪心法在实际执行中通常更快,特别是当最大的好整数比较大时。
代码实现
class Solution {
public:
string largestGoodInteger(string num) {
// 从最大的开始检查
for (char digit = '9'; digit >= '0'; digit--) {
string target(3, digit);
if (num.find(target) != string::npos) {
return target;
}
}
return "";
}
};
class Solution:
def largestGoodInteger(self, num: str) -> str:
# 从最大的开始检查
for digit in '9876543210':
target = digit * 3
if target in num:
return target
return ""
public class Solution {
public string LargestGoodInteger(string num) {
// 从最大的开始检查
for (char digit = '9'; digit >= '0'; digit--) {
string target = new string(digit, 3);
if (num.Contains(target)) {
return target;
}
}
return "";
}
}
var largestGoodInteger = function(num) {
// 从最大的开始检查
for (let digit = 9; digit >= 0; digit--) {
const target = digit.toString().repeat(3);
if (num.includes(target)) {
return target;
}
}
return "";
};
复杂度分析
| 复杂度类型 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 最坏情况下需要检查10个可能的好整数,每次检查需要O(n)时间 |
| 空间复杂度 | O(1) | 只使用了常数额外空间 |