2023-05-08:我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,

并返回唯一字符的个数。

例如:s = "LEETCODE" ,则其中 "L", "T","C","O","D" 都是唯一字符,

因为它们只出现一次,所以 countUniqueChars(s) = 5 。

本题将会给你一个字符串 s ,我们需要返回 countUniqueChars(t) 的总和,

其中 t 是 s 的子字符串。输入用例保证返回值为 32 位整数。

注意,某些子字符串可能是重复的,但你统计时也必须算上这些重复的子字符串

(也就是说,你必须统计 s 的所有子字符串中的唯一字符)。

输入: s = "ABC"。

输出: 10。

答案2023-05-08:

1.定义函数 countUniqueChars(s),参数为字符串 s,返回值为整数。

2.创建一个空的哈希表 indies 来记录每个字符出现的位置。

3.遍历字符串 s 中的每个字符,对于每个字符:

3.1.检查该字符是否已经在 indies 中出现过,如果没有则将其加入哈希表,并将初始位置 -1 添加到其位置数组中。

3.2.将当前字符的位置添加到其位置数组中。

4.初始化计数器 res 为 0。

5.遍历哈希表 indies 中的每个键值对,对于每个键值对:

5.1.在该键所对应的位置数组的末尾添加字符串 s 的长度,方便后续计算。

5.2.遍历该键所对应的位置数组中除了开头和结尾的位置,对于每组相邻的位置 i 和 j,计算左侧有多少个连续的该键字符和右侧有多少个连续的该键字符,累加乘积到 res 中。

6.返回计数器 res

注意:该题目要求统计所有子字符串中的唯一字符的数量,因此需要遍历所有子串。具体实现方法可以枚举所有子串,或者使用一个双重循环来分别枚举子串的起始位置和结束位置,时间复杂度为 O(n^3),其中 n 是字符串 s 的长度。但由于该题目的数据范围较小,因此可以使用暴力枚举来实现。

时间复杂度:

遍历字符串 s 的时间复杂度为 O(n),其中 n 是字符串的长度。

遍历哈希表 indies 中的每个位置数组的时间复杂度为 O(k),其中 k 是该键对应的字符在字符串 s 中出现的次数。

因此,整个程序的时间复杂度为 O(nk)。

额外空间复杂度:

哈希表 indies 和每个键所对应的位置数组的空间复杂度都是 O(k),其中 k 是该键对应的字符在字符串 s 中出现的次数。因此,整个程序的额外空间复杂度为 O(nk)。

go完整代码如下:

package main

import "fmt"

func uniqueLetterString(s string) int {
// key : 某一种字符
// value : 出现这种字符依次的位置
indies := make(map[byte][]int)
for i := 0; i < len(s); i++ {
c := s[i]
if _, ok := indies[c]; !ok {
indies[c] = []int{-1}
}
indies[c] = append(indies[c], i)
}
res := 0
for _, arr := range indies {
arr = append(arr, len(s))
for i := 1; i < len(arr)-1; i++ {
res += (arr[i] - arr[i-1]) * (arr[i+1] - arr[i])
}
}
return res
} func main() {
s := "ABC"
res := uniqueLetterString(s)
fmt.Println(res)
}

rust完整代码如下:

use std::collections::HashMap;

fn unique_letter_string(s: &str) -> i32 {
// key : 某一种字符
// value : 出现这种字符依次的位置
let mut indies: HashMap<char, Vec<i32>> = HashMap::new();
for (i, c) in s.chars().enumerate() {
indies.entry(c).or_insert_with(Vec::new).push(i as i32);
}
let mut res = 0;
for (_, arr) in indies.iter() {
let mut arr = arr.clone();
arr.insert(0, -1);
arr.push(s.len() as i32);
for i in 1..arr.len() - 1 {
res += (arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]);
}
}
res as i32
} fn main() {
let s = "ABC";
let res = unique_letter_string(s);
println!("{}", res);
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAX_N 1000 struct Vector {
int data[MAX_N];
int size;
}; void vector_init(struct Vector* vec) {
memset(vec->data, -1, sizeof(vec->data));
vec->data[0] = -1;
vec->size = 1;
} void vector_push_back(struct Vector* vec, int x) {
vec->data[vec->size++] = x;
} int uniqueLetterString(char* s) {
// key : 某一种字符
// value : 出现这种字符依次的位置
struct Vector indies[256];
int cnt[256] = { 0 };
for (int i = 0; s[i]; i++) {
char c = s[i];
if (cnt[c] == 0) {
vector_init(&indies[c]);
}
vector_push_back(&indies[c], i);
cnt[c]++;
}
int res = 0;
for (int c = 0; c < 256; c++) {
if (cnt[c] == 0) continue;
vector_push_back(&indies[c], strlen(s));
for (int i = 1; i < indies[c].size - 1; i++) {
int left = indies[c].data[i] - indies[c].data[i - 1];
int right = indies[c].data[i + 1] - indies[c].data[i];
res += left * right;
}
}
return res;
} int main() {
char s[] = "ABC";
int res = uniqueLetterString(s);
printf("%d\n", res);
return 0;
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std; int uniqueLetterString(string s) {
// key : 某一种字符
// value : 出现这种字符依次的位置
unordered_map<char, vector<int>> indies;
for (int i = 0; i < s.length(); i++) {
char c = s[i];
if (!indies.count(c)) {
indies[c] = { -1 };
}
indies[c].push_back(i);
}
int res = 0;
for (auto entry : indies) {
auto arr = entry.second;
arr.push_back(s.length());
for (int i = 1; i < arr.size() - 1; i++) {
res += (arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]);
}
}
return res;
} int main() {
string s = "ABC";
int res = uniqueLetterString(s);
cout << res << endl;
return 0;
}

2023-05-08:我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符, 并返回唯一字符的个数。 例如:s = “LEETCODE“ ,则其中 “L“, “T的更多相关文章

  1. (hdu step 7.2.2)GCD Again(欧拉函数的简单应用——求[1,n)中与n不互质的元素的个数)

    题目: GCD Again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. 定义了一个vue全局方法,不能再vuex中进行调用

    你把函数定义在 Vue 的原型链上,只能在 Vue 的实例里才能取到这个方法. vue组件 是一个Vue 的实例,所以你当然能在这里调用到 ajax 方法. 而,vuex 只是一个 vue插件,在 v ...

  3. 写一个函数,实现两个字符串的比较。即实现strcmp函数,s1=s2时返回0,s1!=s2时返回二者第一个不同字符的ASCII值。

    #include<stdio.h> #include<stdlib.h> int main(){ setvbuf(stdout,NULL,_IONBF,); ],s2[]; i ...

  4. 在行列都排好序的矩阵中找数 【题目】 给定一个有N*M的整型矩阵matrix和一个整数K, matrix的每一行和每一 列都是排好序的。实现一个函数,判断K 是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返 回false。 【要求】 时间复杂度为O(N+M),额外空间复杂度为O(1)。

    从对角考虑 package my_basic.class_3; /** * 从对角开始 */ public class Code_09_FindNumInSortedMatrix { public s ...

  5. Thinking in scala (6)----高阶函数----返回一个函数

    在Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数. 在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数.首先来看这 ...

  6. eCos系统无法正确链接到在C++源文件里自己定义的cyg_user_start函数的问题和解决的方法

    在C++源文件里定义cyg_user_start函数前,将其声明成C函数.就可以解决这个问题. eCos官网:http://ecos.sourceware.org eCos中文技术网:http://w ...

  7. vue中data必须是一个函数

    前端面试时经常被问到:“组建中data为什么是函数”? 答案就是:在组件中data必须是一个函数,这样的话,每个实例可以维护一份被返回对象的独立拷贝.

  8. python递归练习:生成一个n级深度的字典,例如:[1,2,3,4,5,6] 可以生成{1: {2: {3: {4: {6: 5}}}}},写一个函数定义n级

    结果#encoding = utf-8#题目:#生成一个n级深度的字典,例如:[1,2,3,4,5,6] 可以生成{1: {2: {3: {4: {6: 5}}}}},写一个函数定义n级a=[1,2, ...

  9. python定义的一个简单的shell函数的代码

    把写代码过程中经常用到的一些代码段做个记录,如下代码段是关于python定义的一个简单的shell函数的代码. pipe = subprocess.Popen(cmd, stdout=subproce ...

  10. ALTER FUNCTION - 修改一个函数的定义

    SYNOPSIS ALTER FUNCTION name ( [ type [, ...] ] ) RENAME TO newname DESCRIPTION 描述 ALTER FUNCTION 修改 ...

随机推荐

  1. 通用图像分割任务- 使用 Mask2Former 和 OneFormer

    本文介绍两个领先的图像分割神经网络模型: Mask2Former 和 OneFormer.相关模型已经在 Transformers 提供. Transformers 是一个开源库,提供了很多便捷的先进 ...

  2. java生态下的后端开发都有哪些技术栈?

    前言 我08年毕业,那时(2003-2010)C#还比较时髦的,大学跟着老师进修的,毕业后就从事winform窗体应用程序开发.慢慢的web网站兴起,就转到aps.net开发,再到后来就上了另一艘船( ...

  3. 11.7 消除闪烁(1)(harib08g)

    ps:看书比较急,有错误的地方欢迎指正,不细致的地方我会持续的修改 11.7 消除闪烁(1)(harib08g) 11.6 高速计数器(harib08f)存在闪烁的问题,产生原因:刷新时会从低到高进行 ...

  4. 如何使用Mutex确保并发程序的正确性

    1. 简介 本文的主要内容是介绍Go中Mutex并发原语.包含Mutex的基本使用,使用的注意事项以及一些实践建议. 2. 基本使用 2.1 基本定义 Mutex是Go语言中的一种同步原语,全称为Mu ...

  5. 【CS231n assignment 2022】 vscode 环境配置

    文章目录 前言 一.安装 Python 二.安装 vscode 三. cs231n 作业下载 四.配置 vscode 五.虚拟环境包安装 六.数据集 前言 今年成功考上了本校的研究生,要开始进入研究生 ...

  6. 关于springboot使用mybatis查询出现空指针,以及debug出现All Elements all Null的解决方法

    数据库中命名方式是带有下划线 ,然后在实体类中使用的是驼峰命名法 ,那么就需要在application.yml文件中加上 自闭了,那么简单的问题,没了解过真是摸不着头脑

  7. Java面试——TCP与HTTP

    更多内容,移步 IT-BLOG 一.Session 和 Cookie 的区别 [1]Cookie 保存在客户端,未设置存储时间的 Cookie,关闭浏览器会话 Cookie 就会被删除:设置了存储时间 ...

  8. Tarjan强连通分量(scc)

    概念解释 节点强连通:\(v_i\)与\(v_j\)(\(v_i ≠ v_j\))强连通是指从\(vi\)到\(vj\)和从\(vj\)到\(vi\)都存在路径,即两节点互相可达 强连通图:在有向图\ ...

  9. 9.SSRF和XML

    SSRF和XML 目录 SSRF和XML SSRF介绍 SSRF漏洞挖掘 SSRF漏洞利用 内网探测: 常见端口探测: 协议探测: file协议敏感文件: XML介绍 DTD定义 DTD作用 XXE介 ...

  10. 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python ...