
题目描述
给定一个字符串数组 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}\) 数组中字符串的平均长度。
| 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
}
|
| 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;
}
|