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

2026-10-08:一次替换后的子序列。用go语言,给定两个只包含小写字母的字符串 s 和 t。你可以在 s 中至多改动一个位置上的字符,把它换成

0
分享至

2026-10-08:一次替换后的子序列。用go语言,给定两个只包含小写字母的字符串 s 和 t。你可以在 s 中至多改动一个位置上的字符,把它换成任意一个小写字母。问经过这样的至多一次改动后,能否让 s 按原有先后顺序出现在 t 中。也就是说,能否从 t 里删掉一些字符后,得到完整的 s;只要求字符顺序一致,不要求连续。如果能够做到,结果为 true;否则为 false。

1 <= s.length, t.length <= 100000。

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

输入: s = "cat", t = "chat"。

输出: true。

解释:

将 s[1] 从 'a' 替换为 'h',得到字符串 "cht"。

"cht" 是 "chat" 的子序列,因为可以按顺序匹配 'c'、'h' 和 't'。

题目来自力扣3983。

大体步骤如下:

  • • 状态一:表示完全没有使用过修改机会时,s 的前面已经有多少个字符成功按顺序匹配到了 t 的当前前缀中。

  • • 状态二:表示最多使用一次修改机会时,s 的前面已经有多少个字符成功按顺序匹配到了 t 的当前前缀中。这里“最多一次”可以是一次都没用,也可以是已经用掉了那唯一的一次修改。

一开始,两个状态都从 0 开始,表示还没有匹配任何字符。如果 s 的长度比 t 还长,那肯定不可能成为子序列,直接返回 false。

然后从左到右依次扫描 t 中的每一个字符。对于当前字符,会做几件事:

  1. 1. 先尝试让“已经用过修改机会”的状态继续正常匹配。
    也就是看 s 中当前待匹配的那个字符,是否正好等于 t 的当前字符。如果相等,就不需要额外修改,直接让这个状态往后走一位。

  2. 2. 再考虑在当前字符处使用修改机会。
    如果“完全没用过修改机会”的状态已经匹配了 s 的前若干个字符,那么我们可以把 s 中下一个还没匹配的字符改成当前 t 的字符,这样就能强行多匹配一个字符。于是“已经用过修改机会”的状态至少可以推进到“未用修改机会的状态 + 1”。如果原来这个状态已经更靠后,就保持不变。这一步体现了“最多改一个字符”的选择。

  3. 3. 然后更新“完全没用过修改机会”的状态。
    看 s 中当前待匹配的字符是否正好等于 t 的当前字符。如果相等,就正常匹配,这个状态也往后走一位。

  4. 4. 每次处理完当前字符后,检查“已经用过修改机会”的状态是否已经达到了 s 的总长度。
    如果达到了,说明整个 s 已经按顺序出现在 t 的处理过的部分里,而且最多只改了一个字符,因此可以直接返回 true。

如果 t 的所有字符都扫描完了,这个状态仍然没有达到 s 的总长度,说明无法做到,返回 false。

用例子 s = "cat",t = "chat" 来看:

  • • 初始两个状态都是 0。

  • • 遇到 t 的 'c':s 的第一个字符也是 'c',所以两个状态都可以正常前进,都变成 1。

  • • 遇到 'h':s 的第二个字符是 'a',不等于 'h'。未用修改的状态不能前进,仍然是 1。但已用修改的状态可以借助修改机会,把 s 的第二个字符 'a' 改成 'h',于是这个状态推进到 2。

  • • 遇到 'a':已用修改的状态当前待匹配的是 s 的第三个字符 't',不等于 'a',不能正常前进;但它已经用过一次修改,不能再改,所以保持 2。未用修改的状态此时待匹配的是 s 的第二个字符 'a',正好等于 'a',所以前进到 2。

  • • 遇到 't':已用修改的状态待匹配的是 s 的第三个字符 't',正好等于 't',于是前进到 3。此时已达到 s 的总长度 3,返回 true。

整个过程中,只遍历了 t 一次,每个字符只做了常数次比较和更新操作,所以总的时间复杂度是 O(t 的长度)。额外使用的变量只有几个整数状态,不随字符串长度增长,所以总的额外空间复杂度是 O(1)。

Go完整代码如下:

package main

import (
"fmt"
)

func canMakeSubsequence(s, t string)bool {
n := len(s)
if n > len(t) {
returnfalse
}

j0 := 0// 在不修改的情况下,s 的前缀 [0, j0-1] 是 t 的当前前缀的子序列
j1 := 0// 在改过一次的情况下,s 的前缀 [0, j1-1] 是 t 的当前前缀的子序列
for _, ch := range t {
// j1 普通匹配
if s[j1] == byte(ch) {
j1++
}

// 也可以修改 s[j0] 为 ch,强行匹配
j1 = max(j1, j0+1)

// j0 普通匹配
if s[j0] == byte(ch) {
j0++
}

if j1 == n {
// s 是 t 的子序列
returntrue
}
}
returnfalse
}

func main() {
s := "cat"
t := "chat"
result := canMakeSubsequence(s, t)
fmt.Println(result)
}

Python完整代码如下:

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

def canMakeSubsequence(s: str, t: str) -> bool:
n = len(s)
if n > len(t):
return False

if n == 0:
return True

j0 = 0 # 不修改时,s 的前缀 [0, j0-1] 已匹配
j1 = 0 # 最多修改一次时,s 的前缀 [0, j1-1] 已匹配

for ch in t:
# j1 尝试正常匹配
if j1 < n and s[j1] == ch:
j1 += 1

# 也可以把 s[j0] 修改为 ch,强行多匹配一个字符
j1 = max(j1, j0 + 1)

# j0 尝试正常匹配
if j0 < n and s[j0] == ch:
j0 += 1

if j1 == n:
return True

return False

if __name__ == "__main__":
s = "cat"
t = "chat"
result = canMakeSubsequence(s, t)
print(result)

C++完整代码如下:

  



bool canMakeSubsequence(const std::string& s, const std::string& t) {
int n = static_cast(s.size());
if (n > static_cast(t.size())) {
returnfalse;
}
if (n == 0) {
returntrue;
}

int j0 = 0; // 不修改时,s 的前缀 [0, j0-1] 已匹配
int j1 = 0; // 最多修改一次时,s 的前缀 [0, j1-1] 已匹配

for (char ch : t) {
// j1 尝试正常匹配
if (j1 < n && s[j1] == ch) {
++j1;
}

// 也可以把 s[j0] 修改为 ch,强行多匹配一个字符
if (j0 < n) {
j1 = std::max(j1, j0 + 1);
}

// j0 尝试正常匹配
if (j0 < n && s[j0] == ch) {
++j0;
}

if (j1 == n) {
returntrue;
}
}
returnfalse;
}

int main() {
std::string s = "cat";
std::string t = "chat";
bool result = canMakeSubsequence(s, t);
std::cout << std::boolalpha << result << std::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.

相关推荐
热点推荐
2026乌镇戏剧节,“江郎才尽”的黄磊,让所有人见识到了他的江湖地位

2026乌镇戏剧节,“江郎才尽”的黄磊,让所有人见识到了他的江湖地位

娱乐圈十三太保
2026-10-17 19:44:22
俄乌最新停火方案中,出现一个诱人条件,泽连斯基普京都很心动?

俄乌最新停火方案中,出现一个诱人条件,泽连斯基普京都很心动?

知法而形
2026-10-16 17:26:39
玄学提醒:如果一个人还在穿着10年前的衣服,说明几个问题

玄学提醒:如果一个人还在穿着10年前的衣服,说明几个问题

木言观
2026-08-02 22:11:24
网贷还不上时,记住这个还款顺序,顺序错了每个月都在白还

网贷还不上时,记住这个还款顺序,顺序错了每个月都在白还

负债老莫
2026-09-09 13:11:34
最邪恶的实验:6女4男船上共渡100天,失去法律约束,结果如何?

最邪恶的实验:6女4男船上共渡100天,失去法律约束,结果如何?

泪满过眼
2026-10-20 07:44:02
中国将迎来史上最大规模的退休潮。

中国将迎来史上最大规模的退休潮。

荆楚寰宇文枢
2026-10-10 22:52:15
妻子和郭德纲关系被扒后,岳云鹏再迎“噩耗”,杨议的话字字戳心

妻子和郭德纲关系被扒后,岳云鹏再迎“噩耗”,杨议的话字字戳心

老缰科普
2026-10-19 18:14:22
国际油价20日下跌

国际油价20日下跌

新华社
2026-10-21 03:40:05
10月20日俄乌:特朗普再度施压乌克兰投降,俄无人机袭击乌儿童

10月20日俄乌:特朗普再度施压乌克兰投降,俄无人机袭击乌儿童

山河路口
2026-10-20 23:31:15
一个中国留学生在巴黎住了三年,说了一句让所有人沉默的话:法国正在被“多元化”毁掉

一个中国留学生在巴黎住了三年,说了一句让所有人沉默的话:法国正在被“多元化”毁掉

步论天下事
2026-10-15 10:15:14
一个远比贪腐更危险的现象,人人闭嘴不谈,正在危害中华民族

一个远比贪腐更危险的现象,人人闭嘴不谈,正在危害中华民族

梦在深巷aqa
2026-10-17 05:48:42
没多少人愿意听实话

没多少人愿意听实话

叶檀财经
2026-10-19 21:30:23
30万斤堆积如山,树上6万斤无人问津,低价卖不动,农民满心无奈

30万斤堆积如山,树上6万斤无人问津,低价卖不动,农民满心无奈

三农雷哥
2026-09-05 12:16:13
央媒定调“尊界刹车门”事件:各打五十大板,懂车帝危险了

央媒定调“尊界刹车门”事件:各打五十大板,懂车帝危险了

鸣金网
2026-10-18 16:59:30
创新药大牛股,前三季度净利最高预增超300%!

创新药大牛股,前三季度净利最高预增超300%!

证券时报
2026-10-20 19:06:03
曼城5-1击退希超劲旅,迎欧冠第二胜,福登3球1助攻

曼城5-1击退希超劲旅,迎欧冠第二胜,福登3球1助攻

侧身凌空斩
2026-10-21 04:51:31
越南准备采购100台盾构机,中方抢先动手,官宣管制盾构机出口

越南准备采购100台盾构机,中方抢先动手,官宣管制盾构机出口

阿绐聊社会
2026-10-20 08:21:03
为什么每个朝代到后期都没钱?看完网友分享我破防了,画面感很强

为什么每个朝代到后期都没钱?看完网友分享我破防了,画面感很强

夜深爱杂谈
2026-10-17 19:21:55
37年来首次无缘,中国男排缺席世界杯,帅位空悬,危机重重!

37年来首次无缘,中国男排缺席世界杯,帅位空悬,危机重重!

体坛侃侃球
2026-10-20 09:05:15
小天赐,终为父母当年的“冲动”买了单,年仅6岁活得不像个小孩

小天赐,终为父母当年的“冲动”买了单,年仅6岁活得不像个小孩

叨唠
2026-05-16 03:21:10
2026-10-21 06:31:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1525文章数 83关注度
往期回顾 全部

科技要闻

新版MiniMax,能和DeepSeek掰手腕吗?

头条要闻

距中国台湾110公里 日美出动6万人大举军演为历史之最

头条要闻

距中国台湾110公里 日美出动6万人大举军演为历史之最

体育要闻

巴拉克:天生亚军与漫长极夜

娱乐要闻

刘恺威承认新恋情,打球认识

财经要闻

抄底万达之后 私募大佬又对恒大下手了

汽车要闻

黑科技一次看全 2026奇瑞全球创新大会干货汇总

态度原创

健康
时尚
房产
数码
家居

痘痘能根治吗?皮肤科医生说实话

秋天穿印花裙真的很有氛围感!不显胖、不呆板,大方又显气质

房产要闻

488亩,两大豪宅级项目爆出!清水湾,要杀回来了!

数码要闻

Mac版Perplexity Computer新增端侧模式,要求36GB统一内存

家居要闻

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

无障碍浏览 进入关怀版