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. OSPF之路由撤销

  2. UGUI按Tab键切换输入框

    脚本挂在输入框的父物体上即可 [code]csharpcode: using System.Collections; using System.Collections.Generic; using U ...

  3. Java笔记第九弹

    升级版: 数据安全问题的解决 1.同步代码块 (弊端:降低了运行效率) 格式:(锁--同一把锁) synchronized(任意对象){ 多条语句操作共享数据的代码 } //sellTicket.ja ...

  4. .NET中委托性能的演变

    .NET中的委托 .NET中的委托是一项重要功能,可以实现间接方法调用和函数式编程. 自.NET Framework 1.0起,委托在.NET中就支持多播(multicast)功能.通过多播,我们可以 ...

  5. 控制论个人学习笔记-线性系统的校正方法&现代控制论基础

    note 2020-08-05搬运 下面的内容来自(我的CSDN博客)[https://blog.csdn.net/weixin_45183579/article/details/105201314] ...

  6. 什么是mvvm?简单介绍它的概念、原理及实现

    1.MVVM的概念 model-view-viewModel,通过数据劫持+发布订阅模式来实现. mvvm是一种设计思想.Model代表数据模型,可以在model中定义数据修改和操作的业务逻辑;vie ...

  7. java选择结构-switch

    java选择结构-switch java的另一个多选择结构switch-case case中的value为常数值. 不加break,会一直执行到最后,包括default(case穿透) switch( ...

  8. 小编亲身实操,教你配置phpstorm与xdebug的调试配置,不成功你骂我

    开发php,还是找个专业的Ide较好,vscode毕竟在php上不专业,需要下载各种插件才行,还不支持多线程调试,因此小编下载了phpstorm,打算以后用phpstorm来开发php项目,断点调试代 ...

  9. Neo4j常用操作——Cypher查询语言

    1. 删除数据库中以往的图,确保一个空白的环境进行操作: MATCH (n) DETACH DELETE n # 要想删除数据库的话直接删除文件即可 2. 创建一个人物节点: CREATE (n:Pe ...

  10. c#动态执行字符串脚本(优化版)

    像javascript中有eval()来执行动态代码,c#中是没有的,于是自己动手丰衣足食, 先来代码 1 using System; 2 using System.Data; 3 using Sys ...