【发布时间】:2015-12-26 00:10:22
【问题描述】:
我正在处理 Rust 中的一些编码挑战,其中一个问题是确定一个短语是否是一个 pangram。我已经看到了以下实现:
// Copy chars into a vector, sort and remove duplicates
let mut chars: Vec<char> = pangram.chars().collect();
chars.sort();
chars.dedup();
然而,这个解决方案是 O(nlogn) 时间,因为排序。我可以在O(n) 时间内完成,但我遇到了问题。
以下是我尝试编写的代码:
fn is_pangram(s: String) -> bool {
let mut num_seen = 0;
let mut seen: [bool; 26] = [false; 26];
for c in s.to_lowercase().as_bytes() {
// ASCII 10 is newline character
if c as usize == 10 {
break;
}
// Lowercase ASCII is 97 to 122
if !seen[122 - c as usize] {
seen[122 - c as usize] = true;
num_seen += 1;
}
}
return num_seen == 26;
}
我收到以下错误:
18:55 $ rustc pangram.rs
pangram.rs:10:12: 10:22 错误:将
&u8转换为usize无效pangram.rs:10 if c as usize == 10 { pangram.rs:10:12: 10:22 帮助:首先通过原始指针进行投射
pangram.rs:14:24: 14:34 错误:将
&u8转换为usize无效pangram.rs:14 if !seen[122 - c as usize] { pangram.rs:14:24: 14:34 帮助:首先通过原始指针进行投射
pangram.rs:15:24: 15:34 错误:将
&u8转换为usize无效pangram.rs:15 seen[122 - c as usize] = true;
pangram.rs:15:24: 15:34 帮助:首先通过原始指针进行转换
错误:由于之前的 3 个错误而中止
我尝试过投射c as *mut usize 和c as *const usize,但都没有成功。我做了多少?
【问题讨论】:
-
去掉评论,改写
if c == '\n' as u8 { break; }。 -
@Veedrac 感谢您的建议。我更改了该行以考虑所有标点符号、空格等。现在是
if c > 122 || c < 97 { continue; }