真钱牛牛

真钱牛牛 2026-04-13: 不同首字母的子字符串数量。用go说话, 给定一个只包

发布日期:2026-04-14 08:37    点击次数:54

真钱牛牛 2026-04-13: 不同首字母的子字符串数量。用go说话, 给定一个只包

2026-04-13:不同首字母的子字符串数量。用go说话,给定一个只包含小写字母的字符串 s。

你需要把它切分红多少个相连、非空的子串(灭绝通盘字符串,且不不异)。

目的是:让子串的数量尽可能多,并餍足限定——每个子串的肇端字符齐必须各不不异,也即是说大肆两个子串的第一个字母不可不异。

请输出餍足上述条目时,子串的最大数量。

1

s 仅由小写英翰墨母构成。

输入: s = "abcd"。

输出: 4。

发挥:

不错将 "abcd" 别离为 "a"、"b"、"c" 和 "d"。

每个子字符串齐以不同的字符着手。因此,谜底是 4。

题目来独力扣3760。

解题经过分步详备样子

一、默契题目中枢要求

咱们需要把给定的纯小写字母字符串,分割成相连、不不异、非空的子串,餍足两个要津条目:

1. 统统子串的肇端字符必须澈底不同(不可有两个子串以消灭个字母着手);

2. 在餍足第一个条目的前提下,分割出的子串数量要尽可能多。

最终输出这个最大的子串数量。

补充:小写字母一共独一26个(a-z),因此最大可能的子串数量恒久不会跨越26,这是中枢限定。

二、解题中枢想路

要让子串数量最多,最优计谋是:尽可能把每个字符单独切分为一个子串,只消这个字符还莫得被用作过子串的肇端字符。

因为一朝某个字母手脚子串着手使用过一次,后续就不可再用了,是以咱们需要纪录一经使用过的肇端字母,遍历字符串时一一判断。

三、分步调扩充经过(以示例 s="abcd" 为例)

步调1:运升沉纪录器具

创建一个标记采集/标记位,特意用来纪录一经被用作子串肇端的字母,运转情状为空,莫得任何字母被使用。

同期运升沉一个计数器,用来统计最终的子串数量,运转值为0。

步调2:从新入手遍历字符串的每一个字符

咱们按礼貌科罚字符串中的每一个字符,判断现时字符是否能手脚新子串的肇端字符:

1. 科罚第一个字符 a:

• 检查 a 是否在已使用的肇端字母蚁纠合 → 未使用;

• 不错将 a 单独切分为一个子串;

• 子串计数器 +1(现时计数:1)。

2. 科罚第二个字符 b:

• 检查 b 是否在已使用的肇端字母蚁纠合 → 未使用;

• 不错将 b 单独切分为一个子串;

• 子串计数器 +1(现时计数:2)。

3. 科罚第三个字符 c:

• 检查 c 是否在已使用的肇端字母蚁纠合 → 未使用;

• 不错将 c 单独切分为一个子串;

• 子串计数器 +1(现时计数:3)。

4. 科罚第四个字符 d:

• 检查 d 是否在已使用的肇端字母蚁纠合 → 未使用;

• 不错将 d 单独切分为一个子串;

• 子串计数器 +1(现时计数:4)。

步调3:遍历实现,输出收尾

通盘字符串遍历完成,计数器的值即是最大子串数量,最终收尾为4。

四、通用场景补充确认(非示例,牛牛匡助默契)

若是字符串出现重复字母,举例 s="abac":

1. 第一个字符a:未使用,切分,计数=1,标记a;

2. 第二个字符b:未使用,切分,计数=2,标记b;

3. 第三个字符a:已标记使用过,不可手脚新子串着手,必须和前一个子串合并(即ba合并为一个子串);

4. 第四个字符c:未使用,切分,计数=3,标记c;

最终收尾为3。

复杂度分析

1. 本领复杂度

• 咱们只需要从新到尾遍历一次字符串,每个字符仅科罚一次;

• 统统判断、标记操作齐是常数本领 O(1)(因为字母独一26个,操作无至极轮回);

• 总本领复杂度:O(n),n 为字符串的长度。

2. 至极空间复杂度

• 咱们仅使用了固定大小的空间(一个整数位标记/26个布尔值标记)来纪录已使用的字母;

• 空间大小不随字符串长度 n 变化,属于常数级空间;

• 总数外空间复杂度:O(1)。

归来

1. 解题中枢:遍历字符串,标记已使用的肇端字母,尽可能切分单个字符为子串;

2. 本领复杂度:O(n)(线性遍历,高效适配10万长度的字符串);

3. 至极空间复杂度:O(1)(常数空间,无至极内存破钞)。

Go圆善代码如下:

package main

import (

"fmt"

"math/bits"

)

func maxDistinct(s string)int {

set := 0

for _, c := range s {

set |= 1

}

return bits.OnesCount(uint(set))

}

func main {

s := "abcd"

result := maxDistinct(s)

fmt.Println(result)

}

Python圆善代码如下:

# -*-coding:utf-8-*-

def max_distinct(s: str) -> int:

bitmask = 0

for c in s:

bitmask |= 1

return bin(bitmask).count('1')

if __name__ == "__main__":

s = "abcd"

result = max_distinct(s)

print(result)

C++圆善代码如下:

#include

#include

#include

int maxDistinct(const std::string& s) {

int set = 0;

for (char c : s) {

set |= 1

}

return std::popcount(static_cast(set));

}

int main {

std::string s = "abcd";

int result = maxDistinct(s);

std::cout

return0;

}

咱们服气东谈主工智能为平日东谈主提供了一种“增强器具”,并勤勉于共享全认识的AI学问。在这里,您不错找到最新的AI科普著作、器具评测、普及恶果的诡秘以及行业瞻念察。

接待柔软“福大大架构师逐日一题”真钱牛牛,发音尘可取得口试贵府,让AI助力您的改日发展。

杏彩(XingCai)官网平台

Copyright © 1998-2026 真钱牛牛APP官方网站™版权所有

haiwanqing.com 备案号 备案号: 

技术支持:®真钱牛牛  RSS地图 HTML地图