2023.6.10 比较字符串最小字母出现频次

image

首先按照题意把f(str)这个函数实现出来。可以考虑用哈希表+sort来实现。
然后根据题目的数据范围,一个字符串最长为2000,可以知道,f(str)[1,2000]
所以可以考虑用前缀和来处理,定义一个长度为2001的数组s,用来作为前缀和数组,s[i]表示f值小于等于i的字符串个数。
每一次query的答案即为s[2000]s[f(query)+1]。即所有f值大于f(query)的字符串个数。

use std::collections::{BTreeSet, HashMap};

impl Solution 
{
    pub fn num_smaller_by_frequency(queries: Vec<String>, words: Vec<String>) -> Vec<i32> 
    {
        fn f(s: &str) -> usize
        {
            let mut chars: Vec<char> = Vec::new();
            let mut map: HashMap<char, i32> = HashMap::new();
            for c in s.chars()
            {
                chars.push(c);
                map.entry(c).and_modify(|v| *v += 1).or_insert(1);
            }

            chars.sort();
            map[&chars[0]] as usize
        }

        let mut s = vec![0; 2001];
        for word in words { s[f(&word)] += 1; }
        for i in 1..2001_usize { s[i] += s[i - 1]; }

        queries.into_iter().map(|query| s[2000] - s[f(&query)]).collect()
    }
}

作者:st0rmKR

出处:https://www.cnblogs.com/st0rmKR/p/17471125.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   烤肉kr  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示