首页 > 其他分享 >2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。

2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。

时间:2023-07-29 22:11:14浏览次数:39  
标签:set 数字 ++ curVal 29 int cnts 字符串 hashCode

2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。

其中的每一个数字出现的频率都相同。

答案2023-07-29:

大体步骤如下:

1.初始化变量base为固定值1000000007,用于计算哈希码。

2.创建一个空的哈希集合set,用于存储独特子字符串的哈希码。

3.创建一个长度为10的整数数组cnts,用于记录数字出现的频率。

4.循环遍历字符串s的每个字符,使用变量l来表示当前子字符串的起始位置。

5.在循环开始时,将数组cnts的所有元素初始化为0。

6.初始化哈希码hashCode为0。

7.初始化变量curVal、maxCnt、maxKinds和allKinds为0,分别表示当前数字值、最大频率、最大频率的数字种类数和所有数字种类数。

8.开始内层循环,依次遍历从l位置开始的子字符串的每个字符,使用变量r表示当前字符的索引。

9.将当前字符转换为整数curVal,同时计算哈希码hashCode,基于base的乘法运算,并加上curVal+1。

10.将cnts[curVal]加1表示当前数字curVal的频率增加了一次。

11.如果cnts[curVal]等于1,说明新出现了一种数字,将allKinds加1,表示所有数字的种类数增加了一种。

12.如果cnts[curVal]大于maxCnt,表示当前数字的频率超过了之前的最大频率,将maxCnt更新为cnts[curVal],并将maxKinds重置为1,表示找到一种新的最大频率数字。

13.如果cnts[curVal]等于maxCnt,表示当前数字的频率和最大频率相同,将maxKinds加1,表示累计的最大频率数字种类数增加了一种。

14.若maxKinds等于allKinds,表示当前子字符串中每种数字都出现了最大频率次数,将当前子字符串的哈希码hashCode添加到集合set中。

15.循环结束后,更新l的值,进入下一个子字符串的计算。

16.返回集合set的大小,即独特子字符串的数量。

17.在main函数中,定义字符串s为"11223",调用equalDigitFrequency函数计算结果,并打印输出。

时间复杂度:

该算法的时间复杂度为O(N2),其中N是字符串s的长度。外层循环遍历字符串s的每个字符,内层循环遍历以每个字符为起始位置的子字符串。因此,总的时间复杂度可以近似为N*(N+1)/2,即O(N2)。

空间复杂度:

该算法的空间复杂度为O(1),因为除了常数个变量之外,没有额外使用大量的空间。集合set的空间取决于独特子字符串的数量,但最坏情况下独特子字符串的数量是固定的,最多只有10个数字种类。因此,可以看作是常数级的空间复杂度,即O(1)。

go完整代码如下:

package main

import (
	"fmt"
	"strconv"
)

func equalDigitFrequency(s string) int {
	base := int64(1000000007)
	set := make(map[int64]bool)
	cnts := make([]int, 10)
	for l := 0; l < len(s); l++ {
		for i := 0; i < 10; i++ {
			cnts[i] = 0
		}
		hashCode := int64(0)
		curVal, maxCnt, maxKinds, allKinds := 0, 0, 0, 0
		for r := l; r < len(s); r++ {
			curVal, _ = strconv.Atoi(string(s[r]))
			hashCode = hashCode*base + int64(curVal+1)
			cnts[curVal]++
			if cnts[curVal] == 1 {
				allKinds++
			}
			if cnts[curVal] > maxCnt {
				maxCnt = cnts[curVal]
				maxKinds = 1
			} else if cnts[curVal] == maxCnt {
				maxKinds++
			}
			if maxKinds == allKinds {
				set[hashCode] = true
			}
		}
	}
	return len(set)
}

func main() {
	s := "11223"
	result := equalDigitFrequency(s)
	fmt.Println(result)
}

在这里插入图片描述

rust完整代码如下:

use std::collections::HashSet;

fn equal_digit_frequency(s: &str) -> usize {
    let base: i64 = 1_000_000_007;
    let mut set: HashSet<i64> = HashSet::new();
    let mut cnts: [i64; 10];
    let ss = s.as_bytes();

    for l in 0..ss.len() {
        cnts = [0; 10];
        let mut hash_code = 0;
        let mut cur_val;
        let (mut max_cnt, mut max_kinds, mut all_kinds) = (0, 0, 0);

        let mut r = l;

        while r < ss.len() {
            cur_val = ss[r] as i64 - '0' as i64;

            hash_code = (hash_code as i64).wrapping_mul(base as i64) + cur_val + 1;

            cnts[cur_val as usize] += 1;
            if cnts[cur_val as usize] == 1 {
                all_kinds += 1;
            }
            if cnts[cur_val as usize] > max_cnt {
                max_cnt = cnts[cur_val as usize];
                max_kinds = 1;
            } else if cnts[cur_val as usize] == max_cnt {
                max_kinds += 1;
            }

            if max_kinds == all_kinds {
                set.insert(hash_code);
            }
            r += 1;
        }
    }

    set.len()
}

fn main() {
    let s = "11223";
    let result = equal_digit_frequency(s);
    println!("{}", result);
}

在这里插入图片描述

c++完整代码如下:

#include <iostream>
#include <unordered_set>
#include <vector>

int equalDigitFrequency(std::string s) {
    const long long base = 1000000007;
    std::unordered_set<long long> set;
    std::vector<int> cnts(10, 0);

    for (int l = 0; l < s.length(); l++) {
        std::fill(cnts.begin(), cnts.end(), 0);
        long long hashCode = 0;
        int curVal, maxCnt = 0, maxKinds = 0, allKinds = 0;

        for (int r = l; r < s.length(); r++) {
            curVal = s[r] - '0';
            hashCode = hashCode * base + curVal + 1;

            cnts[curVal]++;
            if (cnts[curVal] == 1) {
                allKinds++;
            }
            if (cnts[curVal] > maxCnt) {
                maxCnt = cnts[curVal];
                maxKinds = 1;
            }
            else if (cnts[curVal] == maxCnt) {
                maxKinds++;
            }

            if (maxKinds == allKinds) {
                set.insert(hashCode);
            }
        }
    }

    return set.size();
}

int main() {
    std::string s = "11223";
    int result = equalDigitFrequency(s);
    std::cout << result << std::endl;

    return 0;
}

在这里插入图片描述

c完整代码如下:

#include <stdio.h>
#include <stdbool.h>

#define BASE 1000000007
#define MAX_DIGITS 10

int equalDigitFrequency(char* s) {
    unsigned long long set[MAX_DIGITS] = { 0 };
    int cnts[MAX_DIGITS] = { 0 };
    int setSize = 0;

    for (int l = 0; s[l] != '\0'; l++) {
        for (int i = 0; i < MAX_DIGITS; i++) {
            cnts[i] = 0;
        }

        unsigned long long hashCode = 0;
        int curVal, maxCnt = 0, maxKinds = 0, allKinds = 0;

        for (int r = l; s[r] != '\0'; r++) {
            curVal = s[r] - '0';

            hashCode = hashCode * BASE + curVal + 1;
            cnts[curVal]++;

            if (cnts[curVal] == 1) {
                allKinds++;
            }

            if (cnts[curVal] > maxCnt) {
                maxCnt = cnts[curVal];
                maxKinds = 1;
            }
            else if (cnts[curVal] == maxCnt) {
                maxKinds++;
            }

            if (maxKinds == allKinds) {
                bool exists = false;
                for (int i = 0; i < setSize; i++) {
                    if (set[i] == hashCode) {
                        exists = true;
                        break;
                    }
                }
                if (!exists) {
                    set[setSize++] = hashCode;
                }
            }
        }
    }

    return setSize;
}

int main() {
    char s[] = "11223";
    int result = equalDigitFrequency(s);
    printf("%d\n", result);
    return 0;
}

在这里插入图片描述

标签:set,数字,++,curVal,29,int,cnts,字符串,hashCode
From: https://www.cnblogs.com/moonfdd/p/17590662.html

相关文章

  • 【230729-3】如图,在等腰直角三角形ABC中,角BAC=90度,AB=AC,角MAN=45度,BM=1,CN=3. 求:MN的
    【230729-3】如图,在等腰直角三角形ABC中,角BAC=90度,AB=AC,角MAN=45度,BM=1,CN=3. 求:MN的长度?......
  • 2023-07-23~07-29第三周暑假生活
    这周学习上有点懈怠周一周二沉迷小说的虚拟世界,周三周四一天只学了2个小时,周四周五在外县考科目二,还没考过......
  • 7.29总结
    上午醒来选通识课,一开始打算只选一次网课的,下学期再选就够7分,后来发现可以一次性选完,那就一次性选完吧,反正怎么也得选,陆陆续续下了一天雨,也不愿学习,刷了几道题,做了几道报告,今晚有算法协会的组织的课,稍微了解了下,进去看了会。......
  • 暑假集训D6 2023.7.29 补题
    原比赛链接2022年华中科技大学程序设计新生赛(重现赛)官方题解华中科技大学2022新生赛(HUSTFCPC2022)题解&滚榜\(underset\)\(\underset{\sim}Λ\)\(\underset{\sim}{abcd}\)N.WalkAlone'sConjecture题意:给定一个整数\(n\),找出两个数\(x\)和\(y\),使得满足如下......
  • C语言字符串的常用操作
    C语言是一种非常流行的编程语言,它支持各种数据类型,包括整数、浮点数、字符和字符串等。在C语言中,字符串是一种特殊的数据类型,它由一系列字符组成,以\0字符结尾。本文将介绍C语言中字符串的相关知识,包括字符串的定义、初始化、赋值、输入输出、比较、拼接、查找和替换等。一、字符......
  • 2023.7.29 周五:接口 interface
    1//1.约束2//2.用inteface定义,不可实例化,没有构造方法3//3.用implements可实现多个接口45//接口6publicinterfaceService{//用interface定义接口78//在接口中定义的属性,都是常量publicstaticfinal9intAGE=99;10publicstatic......
  • 自学周记(7.22-7.29)
    这周结束了对教资专业课的学习,开始了对于302中学教育知识与能力的学习,掌握了很多教育学的相关知识,对教书育人有了很多新的理解。下星期应该是预备8号的科目三考试加继续对302的学习。除此之外,进行了一些对于ps的训练,以及对于python基础知识的回顾,下周争取看完老师推荐的电视剧,以......
  • 7.29
    Java正则表达式正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。正则表达式实例一个字符串其实就是一个简单的正则表达式,例如 HelloWorld 正则表达式匹配"HelloWorld"字符串。......
  • 2023.7.29-假期周进度报告
    本周(7.23-7.29)主要进行休息。下周准备进行天道的观看。周日,在家进行休息,完成了在家进行休息,遇到了下周准备做什么的问题,解决方法是下周的事情下周再进行考虑。周一,在家进行休息,完成了在家的休息,遇到了家里没人给我做午饭的问题,解决方法是午饭随便吃点就行。周二,进行上周学习的......
  • 7.23-7.29
    7.23今日任务:阅读《大道至简》(完成)复习高数(完成)今日听力练习(完成)今日六级单词(完成)7.24今日任务:继续学习Java(完成)今日pta练习(完成)今日听力练习(完成)今日六级单词(完成)7.25今日任务:阅读《大道至简》(完成)准备旅游7.25-7.29同家人旅游,大概八月初回来期间阅读《大道至......