【问题标题】:How can I check if a &str consists of only a given slice of chars?如何检查 &str 是否仅包含给定的字符片?
【发布时间】:2026-01-28 04:25:01
【问题描述】:
use itertools::Itertools;

fn shifter(s: &str) -> usize {
    s.split(' ')
     .unique()
     .map(|x| x.chars().
}

我正在尝试完成计算给定 &str 包含多少个“移位词”而没有任何重复项的任务。 “移位词”是仅由“H”、“I”、“N”、“O”、“S”、“X”、“Z”、“M”和“W”组成的词。

shifter("SOS IN THE HOME") == 2 // shifter words are "SOS" and "IN"
shifter("WHO IS SHIFTER AND WHO IS NO") == 3 // shifter words are "WHO", "IS", "NO"
shifter("TASK") == 0 // no shifter words
shifter("") == 0 // no shifter words in empty string

【问题讨论】:

    标签: rust


    【解决方案1】:

    把它们放在一起:

    fn shifter(s: &str) -> usize {
        s.split(' ')
            .unique()
            .filter(|x| !x.is_empty() && x.chars().all(|c| "HINOSXZMW".contains(c)))
            .count()
    }
    

    is_empty() 存在是因为 all() 为空集合返回 true。

    playground 上查看它。

    【讨论】:

    • 交换 filterunique 似乎是一个明显的改进
    【解决方案2】:

    您可以使用Iterator::all()str::contains 测试每个元素是否与给定谓词匹配。

    "SOS".chars().all(|c| "HINOSXZMW".contains(c)); // true
    

    请注意,还有slice::contains,因此以下内容也可以使用:

    let letters = ['H', 'I', 'N', 'O', 'S', 'X', 'Z', 'M', 'W'];
    
    "SOS".chars().all(|c| letters.contains(&c)); // true
    

    【讨论】:

      最近更新 更多