跳转至

3491. 电话号码前缀 🔒

题目描述

给定一个字符串数组 numbers 表示电话号码。如果没有电话号码是任何其他电话号码的前缀,则返回 true;否则,返回 false

 

示例 1:

输入:numbers = ["1","2","4","3"]

输出:true

解释:

没有数字是其它数字的前缀,所以输出为 true

示例 2:

输入:numbers = ["001","007","15","00153"]

输出:false

解释:

字符串 "001" 是字符串 "00153" 的前缀。因此,输出是 false

 

提示:

  • 2 <= numbers.length <= 50
  • 1 <= numbers[i].length <= 50
  • 所有数字只包含 '0' 到 '9' 的数位。

解法

方法一:排序 + 前缀判断

我们可以先对 \(\textit{numbers}\) 数组按照字符串长度进行排序,然后遍历数组中的每一个字符串 \(\textit{s}\),判断此前是否有字符串 \(\textit{t}\)\(\textit{s}\) 的前缀,如果有,说明存在一个字符串是另一个字符串的前缀,返回 \(\textit{false}\)。如果遍历完所有字符串都没有找到前缀关系,返回 \(\textit{true}\)

时间复杂度 \((n^2 \times m + n \times \log n)\),空间复杂度 \((m + \log n)\),其中 \(n\)\(\textit{numbers}\) 数组的长度,而 \(m\)\(\textit{numbers}\) 数组中字符串的平均长度。

1
2
3
4
5
6
7
class Solution:
    def phonePrefix(self, numbers: List[str]) -> bool:
        numbers.sort(key=len)
        for i, s in enumerate(numbers):
            if any(s.startswith(t) for t in numbers[:i]):
                return False
        return True
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution {
    public boolean phonePrefix(String[] numbers) {
        Arrays.sort(numbers, (a, b) -> Integer.compare(a.length(), b.length()));
        for (int i = 0; i < numbers.length; i++) {
            String s = numbers[i];
            for (int j = 0; j < i; j++) {
                if (s.startsWith(numbers[j])) {
                    return false;
                }
            }
        }
        return true;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <ranges>

class Solution {
public:
    bool phonePrefix(vector<string>& numbers) {
        ranges::sort(numbers, [](const string& a, const string& b) {
            return a.size() < b.size();
        });
        for (int i = 0; i < numbers.size(); i++) {
            if (ranges::any_of(numbers | views::take(i), [&](const string& t) {
                    return numbers[i].starts_with(t);
                })) {
                return false;
            }
        }
        return true;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func phonePrefix(numbers []string) bool {
    sort.Slice(numbers, func(i, j int) bool {
        return len(numbers[i]) < len(numbers[j])
    })
    for i, s := range numbers {
        for _, t := range numbers[:i] {
            if strings.HasPrefix(s, t) {
                return false
            }
        }
    }
    return true
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function phonePrefix(numbers: string[]): boolean {
    numbers.sort((a, b) => a.length - b.length);
    for (let i = 0; i < numbers.length; i++) {
        for (let j = 0; j < i; j++) {
            if (numbers[i].startsWith(numbers[j])) {
                return false;
            }
        }
    }
    return true;
}

评论