网易首页 > 网易号 > 正文 申请入驻

2026-07-02:将一个字符串排序的最小操作次数。用go语言,问题:给定只包含小写字母的字符串 s。你可以反复进行操作:每次选取 s 的一个

0
分享至

2026-07-02:将一个字符串排序的最小操作次数。用go语言,问题:给定只包含小写字母的字符串 s。你可以反复进行操作:每次选取 s 的一个连续子串,但子串不能覆盖整个字符串;然后把这个子串内部的字符按“从小到大不降序”重新排列。目标是通过尽可能少的这种操作,使整个字符串最终变成非降序(即从左到右字母不减)。

要求:计算实现上述目标所需的最小操作次数;如果无论怎么操作都无法做到,则输出 -1。

1 <= s.length <= 100000。

s 仅由小写英文字母组成。

输入: s = "dog"。

输出: 1。

解释:

将子字符串 "og" 排序为 "go"。

现在,s = "dgo",已按升序排列。因此,答案是 1。

题目来自力扣3863。

一、函数逻辑分步拆解(逐段流程详解)

整体逻辑是分6层条件逐层判断,从最优解(0次)到最差解(3次)依次匹配,匹配到即直接返回答案,无需后续判断。

步骤1:判断原字符串是否已经全局升序

  1. 1. 将字符串转为字节切片,调用有序校验函数检查完整数组是否非降;

  2. 2. 若本身有序,不需要任何操作,直接返回操作次数0。

  3. 3. 示例dog原始序列 d→o→g,o > g,不满足升序,进入下一步判断。

步骤2:特殊边界判断——字符串长度等于2

规则:长度为2时,可选子串只能是单个字符(排序单个字符无变化),不存在有效操作能调换两个字符,永远无法排序,直接返回-1。
示例dog长度为3,跳过该分支,继续判断。

步骤3:找出全局最小字符 mn、全局最大字符 mx

遍历整个字符数组,提取全部字符里ASCII最小、最大的字母:

  • • s="dog" 字符ASCII:d=100,o=111,g=103

  • • mn = d(100),mx = o(111)

步骤4:判断能否仅用1次操作完成排序(返回1)

判定条件满足其一即可:

  1. 1. 字符串第一个字符就是全局最小值 mn;
    含义:首字符已经是全串最小,只需要对除去首字符的后半段连续子串做一次升序排序,后半段有序后整体必然全局升序;

  2. 2. 字符串最后一个字符就是全局最大值 mx;
    含义:末尾字符已经是全串最大,只需要对除去末尾字符的前半段连续子串做一次升序排序,前半段有序后整体必然全局升序。

代入示例 "dog" 验证

首字符 t[0] = d,正好等于全局最小值 mn,满足第一条判定条件,直接返回操作次数1,和题目输出结果一致。
操作对应解释:选取后两位连续子串og排序为go,得到dgo全局升序,仅1次操作。

补充该分支通用场景举例

例1:s="dxb",mn=d在首位,排序[x,b]一次即可;
例2:s="bdz",mx=z在末尾,排序[b,d]一次即可。

步骤5:不满足1次操作,判断能否仅用2次操作完成排序(返回2)

前置前提:首字符不是全局最小、末尾字符不是全局最大。
遍历中间区间t[1 : n-1](去掉第一个、最后一个字符的中间所有字符):
只要中间任意一个字符等于全局最小值mn 或 全局最大值mx,就返回2次操作。

原理说明

两种场景对应两次操作方案:

  1. 1. 中间存在全局最小值mn:
    第一次操作:排序[0, n-2](除最后一位),把中间的最小值挪到字符串最左侧;
    第二次操作:排序[1, n-1](除第一位),将后半段全部理顺,整体有序;

  2. 2. 中间存在全局最大值mx:
    第一次操作:排序[1, n-1](除第一位),把中间最大值挪到字符串最右侧;
    第二次操作:排序[0, n-2](除最后一位),理顺前半段,整体有序。

步骤6:仅剩最坏场景,固定需要3次操作(返回3)

前置全部条件都不满足时,唯一剩余特征:

  1. 1. 第一个字符是全局最大值mx;

  2. 2. 最后一个字符是全局最小值mn;

  3. 3. 中间所有字符既不含全局最小mn,也不含全局最大mx。

三次操作完整逻辑
  1. 1. 第一次操作:排序子串[0, n-2](去掉末尾),将首位的全局最大值移动到倒数第二位;

  2. 2. 第二次操作:排序子串[1, n-1](去掉首位),把全局最大值移到最后一位,同时把末尾的全局最小值挪到第二位;

  3. 3. 第三次操作:再次排序子串[0, n-2],将第二位的全局最小值移动到第一位,整个字符串完全升序。

二、无解场景总结

仅一种情况输出-1:字符串长度严格等于2,无论字符如何排列,都无法通过规则内操作实现升序。

三、时间复杂度分析 1. 各环节耗时拆解

  1. 1. slices.IsSorted:完整遍历一次字符串,O(n);

  2. 2. slices.Min、slices.Max:各遍历一次字符串,合计O(n);

  3. 3. 中间区间循环t[1:n-1]:最坏遍历n-2个字符,O(n);
    所有步骤为顺序串行执行,无嵌套循环。

总时间复杂度

O(n),n为字符串长度,线性复杂度,可支持题目上限1e5长度输入。

四、额外空间复杂度分析 空间占用来源

仅创建一个字节切片t := []byte(s)存储字符串副本,占用n字节;其余变量(mn、mx、循环临时变量)为常数级空间,不随字符串长度变化。

总额外空间复杂度

O(n)
补充优化说明:若不复制完整切片,仅通过索引读取原字符串字符,可优化为O(1)常数空间;当前代码实现采用切片拷贝,因此空间为线性O(n)。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

func minOperations(s string)int {
t := []byte(s)
// s 已经是升序
if slices.IsSorted(t) {
return0
}

n := len(t)
// 长为 2,无法排序
if n == 2 {
return-1
}

mn := slices.Min(t)
mx := slices.Max(t)
// 如果 s[0] 是最小值,排序 [1,n-1] 即可
// 如果 s[n-1] 是最大值,排序 [0,n-2] 即可
if t[0] == mn || t[n-1] == mx {
return1
}

// 如果 [1,n-2] 中有最小值,那么先排序 [0,n-2],把最小值排在最前面,然后排序 [1,n-1] 即可
// 如果 [1,n-2] 中有最大值,那么先排序 [1,n-1],把最大值排在最后面,然后排序 [0,n-2] 即可
for _, ch := range t[1 : n-1] {
if ch == mn || ch == mx {
return2
}
}

// 现在只剩下一种情况:s[0] 是最大值,s[n-1] 是最小值,且 [1,n-2] 不含最小值和最大值
// 先排序 [0,n-2],把最大值排到 n-2
// 然后排序 [1,n-1],把最大值排在最后面,且最小值排在 1
// 最后排序 [0,n-2],把最小值排在最前面
return3
}

func main() {
s := "dog"
result := minOperations(s)
fmt.Println(result)
}

Python完整代码如下:

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

from typing import List

def minOperations(s: str) -> int:
t = list(s)
n = len(t)
# s 已经是升序
if all(t[i] <= t[i+1] for i in range(n-1)):
return0
# 长为 2,无法排序
if n == 2:
return-1
mn = min(t)
mx = max(t)
# 如果 s[0] 是最小值,排序 [1,n-1] 即可
# 如果 s[n-1] 是最大值,排序 [0,n-2] 即可
if t[0] == mn or t[n-1] == mx:
return1
# 如果 [1,n-2] 中有最小值,那么先排序 [0,n-2],把最小值排在最前面,然后排序 [1,n-1] 即可
# 如果 [1,n-2] 中有最大值,那么先排序 [1,n-1],把最大值排在最后面,然后排序 [0,n-2] 即可
for ch in t[1:n-1]:
if ch == mn or ch == mx:
return2
# 现在只剩下一种情况:s[0] 是最大值,s[n-1] 是最小值,且 [1,n-2] 不含最小值和最大值
# 先排序 [0,n-2],把最大值排到 n-2
# 然后排序 [1,n-1],把最大值排在最后面,且最小值排在 1
# 最后排序 [0,n-2],把最小值排在最前面
return3

def main():
s = "dog"
result = minOperations(s)
print(result)

if __name__ == "__main__":
main()

C++完整代码如下:

  



using namespace std;

int minOperations(string s) {
string t = s;
int n = t.length();

// s 已经是升序
if (is_sorted(t.begin(), t.end())) {
return0;
}

// 长为 2,无法排序
if (n == 2) {
return-1;
}

char mn = *min_element(t.begin(), t.end());
char mx = *max_element(t.begin(), t.end());

// 如果 s[0] 是最小值,排序 [1,n-1] 即可
// 如果 s[n-1] 是最大值,排序 [0,n-2] 即可
if (t[0] == mn || t[n-1] == mx) {
return1;
}

// 如果 [1,n-2] 中有最小值,那么先排序 [0,n-2],把最小值排在最前面,然后排序 [1,n-1] 即可
// 如果 [1,n-2] 中有最大值,那么先排序 [1,n-1],把最大值排在最后面,然后排序 [0,n-2] 即可
for (int i = 1; i < n - 1; i++) {
if (t[i] == mn || t[i] == mx) {
return2;
}
}

// 现在只剩下一种情况:s[0] 是最大值,s[n-1] 是最小值,且 [1,n-2] 不含最小值和最大值
// 先排序 [0,n-2],把最大值排到 n-2
// 然后排序 [1,n-1],把最大值排在最后面,且最小值排在 1
// 最后排序 [0,n-2],把最小值排在最前面
return3;
}

int main() {
string s = "dog";
int result = minOperations(s);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
三人劫杀摩的司机潜逃30年:一人自首坠亡,两人被判死缓和无期

三人劫杀摩的司机潜逃30年:一人自首坠亡,两人被判死缓和无期

新京报
2026-08-11 16:10:45
殡葬业遭遇“寒潮”!老龄化加剧,为何“死人生意”反而亏钱了?

殡葬业遭遇“寒潮”!老龄化加剧,为何“死人生意”反而亏钱了?

铭记历史呀
2026-08-11 17:09:17
巴图姆谈库里"黄金匕首":全世界99.9999%的人都会投丢

巴图姆谈库里"黄金匕首":全世界99.9999%的人都会投丢

北青网-北京青年报
2026-08-11 20:51:07
我把工资卡上交我妈16年,老婆从不过问,我爸脑梗手术要73万,她却说:你妈卡里不是有620万吗?

我把工资卡上交我妈16年,老婆从不过问,我爸脑梗手术要73万,她却说:你妈卡里不是有620万吗?

南派将军
2026-08-11 15:51:24
车晓谈前夫李兆会:世上除了我妈他最爱我,但他的爱令我无法承受

车晓谈前夫李兆会:世上除了我妈他最爱我,但他的爱令我无法承受

孤城落日
2026-08-11 09:03:02
莫迪政府肠子都悔青了!印度对外资频频上演“杀猪盘”,信誉早已坍塌,如今重新敞开大门,中企啥反应?

莫迪政府肠子都悔青了!印度对外资频频上演“杀猪盘”,信誉早已坍塌,如今重新敞开大门,中企啥反应?

人生录
2026-08-12 00:05:08
汪峰把公司1100人砍到400人,700人被裁。他说:“引入AI两个月,剩下400人干得比原来还好”,财务笑开了花。

汪峰把公司1100人砍到400人,700人被裁。他说:“引入AI两个月,剩下400人干得比原来还好”,财务笑开了花。

背包旅行
2026-08-11 11:40:42
价值15亿长征七号改运载火箭中星4B卫星发射失败!安全天数清零!

价值15亿长征七号改运载火箭中星4B卫星发射失败!安全天数清零!

大稻网络科技
2026-08-11 01:21:23
心理学发现一个惊人的现象:很多有女儿的家庭,只要女儿结婚了,那女儿和父母之间,慢慢就变得像亲戚关系

心理学发现一个惊人的现象:很多有女儿的家庭,只要女儿结婚了,那女儿和父母之间,慢慢就变得像亲戚关系

心理观察局
2026-08-11 07:31:06
太会玩了!!“浙江杭州,一个已婚少妇真的好风流,嫌弃丈夫…”

太会玩了!!“浙江杭州,一个已婚少妇真的好风流,嫌弃丈夫…”

王二哥老搞笑
2026-08-08 09:14:02
陪玩陪睡只是皮毛!继手伸进裤子后,又一女星自曝,50多都不放过

陪玩陪睡只是皮毛!继手伸进裤子后,又一女星自曝,50多都不放过

不似少年游
2026-06-22 19:32:51
甘肃敦煌月牙泉景区售货机芬达标价每瓶180元?景区负责人回应

甘肃敦煌月牙泉景区售货机芬达标价每瓶180元?景区负责人回应

新京报
2026-08-11 20:38:21
俄罗斯白打了?最新民调:60%乌克兰人宁忍战火,也不出卖乌东

俄罗斯白打了?最新民调:60%乌克兰人宁忍战火,也不出卖乌东

麓谷隐士
2026-08-11 07:25:07
浙大调查562名胰腺癌逝者,发现:得胰腺癌的人,大多有这3大共性

浙大调查562名胰腺癌逝者,发现:得胰腺癌的人,大多有这3大共性

叙说医疗健康
2026-08-12 05:00:11
细思极恐!930万人超大型研究证实:99.6%的心脏病发作,都和这4项有关!

细思极恐!930万人超大型研究证实:99.6%的心脏病发作,都和这4项有关!

趣味探索
2026-08-09 23:41:52
瑞典大满贯!陈熠零封,日本大胜,国乒2人出局,王曼昱首秀出炉

瑞典大满贯!陈熠零封,日本大胜,国乒2人出局,王曼昱首秀出炉

林子说事
2026-08-11 08:15:12
穆里尼奥执教皇马初期,与卡西理念冲突:皇马更衣室,不能由球员做主

穆里尼奥执教皇马初期,与卡西理念冲突:皇马更衣室,不能由球员做主

体育闲话说
2026-08-12 06:28:58
拉萨海关关员对入境旅客进行监管时,发现1名通关旅客神态异常,经查,在该旅客手臂、腹部查获捆绑夹藏的多国货币,折合人民币约54.9万元

拉萨海关关员对入境旅客进行监管时,发现1名通关旅客神态异常,经查,在该旅客手臂、腹部查获捆绑夹藏的多国货币,折合人民币约54.9万元

环球网资讯
2026-08-11 08:37:57
乌克兰袭击俄罗斯炼油厂,距离乌边境1200公里,已致13死78伤,媒体称或为乌对俄本土发动的最致命袭击之一;基辅遭遇弹道导弹袭击

乌克兰袭击俄罗斯炼油厂,距离乌边境1200公里,已致13死78伤,媒体称或为乌对俄本土发动的最致命袭击之一;基辅遭遇弹道导弹袭击

每日经济新闻
2026-08-11 08:59:05
美股纳指收跌0.6% SK海力士涨超4%

美股纳指收跌0.6% SK海力士涨超4%

财联社
2026-08-12 04:26:25
2026-08-12 07:00:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1388文章数 79关注度
往期回顾 全部

科技要闻

AI大战变天:扎克伯格突然回头

头条要闻

郭兰英逝世 代表作《我的祖国》《南泥湾》

头条要闻

郭兰英逝世 代表作《我的祖国》《南泥湾》

体育要闻

NBA老顽童,抽着大麻喝着小酒告别了

娱乐要闻

“雅典娜”确认被害 细节令人发指!

财经要闻

AI泡沫的剧本,是2008年的次贷危机?

汽车要闻

闪充/天神之眼B/云辇-C 2027款海豹06售9.99万元起

态度原创

家居
时尚
游戏
旅游
手机

家居要闻

2026建博会(广州) 公装联探展交流活动

时速60公里,“慢”车去南非

魔兽世界:时光服紧急削弱,精英玩家破灭,难度党为什么消失了?

旅游要闻

韩国赴华游升温,上海青岛受追捧

手机要闻

iQOO Z11S再预热,宁德新能源联合研发电池

无障碍浏览 进入关怀版