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;
}

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

  1. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  2. python练习:假设s是一个字符串,返回s中十进制数字之和。例如,如果s是‘a2b3c’,则返回5。

    python练习:假设s是一个字符串,返回s中十进制数字之和.例如,如果s是‘a2b3c’,则返回5. 重难点:字符串转化为字符序列.in的多种应用.try-except代码块的使用. print(& ...

  3. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

  4. SpriteBuilder修改CCB文件中的子CCB文件需要注意的一个地方

    在SpriteBuilder中如果一个CCB(比如一个场景)中嵌入了另一个子CCB文件(比如一个player),那么当给该子CCB中的root对象添加若干属性的时候,必须注意到这个并没有应用到父CCB ...

  5. 一个简单的程序,统计文本文档中的单词和汉字数,逆序排列(出现频率高的排在最前面)。python实现。

    仅简单统计英文. from collections import Counter f = open('1') c = Counter() for line in f: g = (x for x in ...

  6. 在java中为什么要把main方法定义为一个static方法?

    我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为ja ...

  7. 输入一个字符串,内有数字和非数字字符。例如:a123x456 17960 302tab5876。将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。

    题目内容:输入一个字符串,内有数字和非数字字符.例如:a123x456 17960 302tab5876.将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1 ...

  8. 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。

    package 华为机试; //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的 ...

  9. 输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少

    输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9.因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字 ...

  10. 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(

    通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...

随机推荐

  1. 民谣女神唱流行,基于AI人工智能so-vits库训练自己的音色模型(叶蓓/Python3.10)

    流行天后孙燕姿的音色固然是极好的,但是目前全网都是她的声音复刻,听多了难免会有些审美疲劳,在网络上检索了一圈,还没有发现民谣歌手的音色模型,人就是这样,得不到的永远在骚动,本次我们自己构建训练集,来打 ...

  2. 2022-10-16:以下go语言代码输出什么?A:timed out;B:panic;C:没有任何输出。 package main import ( “context“ “fmt“

    2022-10-16:以下go语言代码输出什么?A:timed out:B:panic:C:没有任何输出. package main import ( "context" &quo ...

  3. .cur 图片加载提示 You may need an appropriate loader to handle this file type

    最近一个gis 项目需要加载一个.cur的图标,但是编译时提示 You may need an appropriate loader to handle this file type, current ...

  4. vue使用import()提示语法错误

    一.使用import 引入 组件 二.编译时提示语法检测错误 三.解决方法 第一种方式:直接安装 D:\YLKJPro\CMWEB\03Implement\CustomMapWeb>npm in ...

  5. 在 Linux 和 Windows 下源码安装 Perl

    Perl 是一种功能丰富的计算机程序语言,运行在超过 100 种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发.在生物信息分析领域,Perl 主要是做数据预处理.文本处理 ...

  6. Windows全能终端神器MobaXterm

    MobaXterm 又名 MobaXVT,是一款增强型终端.X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱. MobaXterm 可以开启多个终端视窗,以最新的 X 服务器为基础的 X ...

  7. 解决log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory). log4j:WARN Please initialize the log4j system properly.警告

    1. 问题分析 使用log4j时不起作用,因为找不到配置文件log4j.properties,存在的问题可能是没有配置log4j.properties文件,也可能是配置文件log4j.properti ...

  8. 【leetcode】#647 回文子串 Rust Solution

    给定一个字符串,你的任务是计算这个字符串中有多少个回文子串.具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串. 示例 1:输入:"abc"输出:3解释 ...

  9. 稳,从数据库连接池 testOnBorrow 看架构设计

    本文从 Commons DBCP testOnBorrow 的作用机制着手,管中窥豹,从一点去分析数据库连接池获取的过程以及架构分层设计. 以下内容会按照每层的作用,贯穿分析整个调用流程. 1️⃣框架 ...

  10. celery笔记七之周期/定时任务及crontab定义

    本文首发于公众号:Hunter后端 原文链接:celery笔记七之周期/定时任务及crontab定义 periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或 ...