2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。
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 中独特子字符串数量。 其中的每一个数字出现的频率都相同。的更多相关文章
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- python练习:假设s是一个字符串,返回s中十进制数字之和。例如,如果s是‘a2b3c’,则返回5。
python练习:假设s是一个字符串,返回s中十进制数字之和.例如,如果s是‘a2b3c’,则返回5. 重难点:字符串转化为字符序列.in的多种应用.try-except代码块的使用. print(& ...
- 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。
[题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...
- SpriteBuilder修改CCB文件中的子CCB文件需要注意的一个地方
在SpriteBuilder中如果一个CCB(比如一个场景)中嵌入了另一个子CCB文件(比如一个player),那么当给该子CCB中的root对象添加若干属性的时候,必须注意到这个并没有应用到父CCB ...
- 一个简单的程序,统计文本文档中的单词和汉字数,逆序排列(出现频率高的排在最前面)。python实现。
仅简单统计英文. from collections import Counter f = open('1') c = Counter() for line in f: g = (x for x in ...
- 在java中为什么要把main方法定义为一个static方法?
我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为ja ...
- 输入一个字符串,内有数字和非数字字符。例如:a123x456 17960 302tab5876。将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1]……统计共有多少个整数,并输出这些数。
题目内容:输入一个字符串,内有数字和非数字字符.例如:a123x456 17960 302tab5876.将其中连续的数字作为一个整数,依次存放到一维数组a中,例如123放在a[0],456放在a[1 ...
- 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。
package 华为机试; //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的 ...
- 输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少
输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9.因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字 ...
- 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(
通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...
随机推荐
- 民谣女神唱流行,基于AI人工智能so-vits库训练自己的音色模型(叶蓓/Python3.10)
流行天后孙燕姿的音色固然是极好的,但是目前全网都是她的声音复刻,听多了难免会有些审美疲劳,在网络上检索了一圈,还没有发现民谣歌手的音色模型,人就是这样,得不到的永远在骚动,本次我们自己构建训练集,来打 ...
- 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 ...
- .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 ...
- vue使用import()提示语法错误
一.使用import 引入 组件 二.编译时提示语法检测错误 三.解决方法 第一种方式:直接安装 D:\YLKJPro\CMWEB\03Implement\CustomMapWeb>npm in ...
- 在 Linux 和 Windows 下源码安装 Perl
Perl 是一种功能丰富的计算机程序语言,运行在超过 100 种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发.在生物信息分析领域,Perl 主要是做数据预处理.文本处理 ...
- Windows全能终端神器MobaXterm
MobaXterm 又名 MobaXVT,是一款增强型终端.X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱. MobaXterm 可以开启多个终端视窗,以最新的 X 服务器为基础的 X ...
- 解决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 ...
- 【leetcode】#647 回文子串 Rust Solution
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串.具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串. 示例 1:输入:"abc"输出:3解释 ...
- 稳,从数据库连接池 testOnBorrow 看架构设计
本文从 Commons DBCP testOnBorrow 的作用机制着手,管中窥豹,从一点去分析数据库连接池获取的过程以及架构分层设计. 以下内容会按照每层的作用,贯穿分析整个调用流程. 1️⃣框架 ...
- celery笔记七之周期/定时任务及crontab定义
本文首发于公众号:Hunter后端 原文链接:celery笔记七之周期/定时任务及crontab定义 periodic task,即为周期,或者定时任务,比如说每天晚上零点零分需要运行一遍某个函数,或 ...