2025-06-15:重排子字符串以形成目标字符串。用go语言,给定两个字符串 s 和 t,它们是字母异位词(即包含完全相同的字
【摘要】 2025-06-15:重排子字符串以形成目标字符串。用go语言,给定两个字符串 s 和 t,它们是字母异位词(即包含完全相同的字符,只是顺序不同),以及一个整数 k。你的任务是判断是否可能将 s 分成 k 个长度相等的连续子串,然后对这些子串重新排序,最终拼接成字符串 t。如果可以实现,返回 true;否则返回 false。1 <= s.length == t.length <= 2 * 1...
2025-06-15:重排子字符串以形成目标字符串。用go语言,给定两个字符串 s 和 t,它们是字母异位词(即包含完全相同的字符,只是顺序不同),以及一个整数 k。
你的任务是判断是否可能将 s 分成 k 个长度相等的连续子串,然后对这些子串重新排序,最终拼接成字符串 t。
如果可以实现,返回 true;否则返回 false。
1 <= s.length == t.length <= 2 * 100000。
1 <= k <= s.length。
s.length 能被 k 整除。
s 和 t 仅由小写英文字母组成。
输入保证 s 和 t 互为字母异位词。
输入: s = “aabbcc”, t = “bbaacc”, k = 3。
输出: true。
解释:
将 s 分割成 3 个长度为 2 的子字符串:[“aa”, “bb”, “cc”]。
重新排列这些子字符串为 [“bb”, “aa”, “cc”],然后连接它们得到 “bbaacc”,与 t 相匹配。
题目来自力扣3365。
步骤描述:
-
初始化切片:
- 创建两个长度为
k的字符串切片a和b,用于存储分割后的子字符串。这里k是分割的子字符串数量。
- 创建两个长度为
-
计算子字符串长度:
- 计算每个子字符串的长度
n/k,其中n是字符串s和t的长度。这里n必须能被k整除,题目已保证这一点。
- 计算每个子字符串的长度
-
分割字符串
s和t:- 将字符串
s分割为k个长度为n/k的连续子字符串,并存储到切片a中。 - 同样地,将字符串
t分割为k个长度为n/k的连续子字符串,并存储到切片b中。
- 将字符串
-
排序切片:
- 对切片
a和b分别进行排序。排序的目的是为了后续比较两个切片是否包含完全相同的子字符串(顺序可以不同)。
- 对切片
-
比较切片:
- 比较排序后的
a和b是否完全相同。如果相同,说明可以通过重新排列s的子字符串得到t,返回true;否则返回false。
- 比较排序后的
时间复杂度:
- 分割字符串:分割
s和t各需要O(n)时间,因为需要遍历整个字符串。 - 排序切片:每个切片有
k个元素,每个元素的长度为n/k。排序的比较操作是字符串比较,最坏情况下需要O(n/k)时间(例如所有字符串几乎相同)。因此排序的总时间复杂度为O(k * logk * (n/k)) = O(n logk)。- 排序
a和b的总时间为O(n logk)。
- 排序
- 比较切片:比较两个长度为
k的切片,每个字符串比较需要O(n/k)时间,因此总时间为O(n)。
- 总时间复杂度:
O(n) + O(n logk) + O(n) = O(n logk)。
额外空间复杂度:
- 存储切片
a和b:每个切片存储k个子字符串,每个子字符串长度为n/k,因此总空间为O(2 * n) = O(n)。 - 排序的额外空间:Go 的
slices.Sort对字符串切片的排序通常需要O(k)的额外空间(用于存储指针或索引)。
- 总额外空间复杂度:
O(n) + O(k) = O(n)(因为k <= n)。
总结:
- 总时间复杂度:
O(n logk)。 - 总额外空间复杂度:
O(n)。
Go完整代码如下:
.
package main
import (
"fmt"
"slices"
)
func isPossibleToRearrange(s, t string, k int) bool {
a := make([]string, 0, k) // 预分配空间
b := make([]string, 0, k)
n := len(s)
k = n / k
for i := k; i <= n; i += k {
a = append(a, s[i-k:i])
b = append(b, t[i-k:i])
}
slices.Sort(a)
slices.Sort(b)
return slices.Equal(a, b)
}
func main() {
s := "aabbcc"
t := "bbaacc"
k := 3
fmt.Println(isPossibleToRearrange(s,t,k))
}

Python完整代码如下:
.
# -*-coding:utf-8-*-
def is_possible_to_rearrange(s: str, t: str, k: int) -> bool:
n = len(s)
segment_len = n // k
a = [s[i:i+segment_len] for i in range(0, n, segment_len)]
b = [t[i:i+segment_len] for i in range(0, n, segment_len)]
a.sort()
b.sort()
return a == b
if __name__ == "__main__":
s = "aabbcc"
t = "bbaacc"
k = 3
print(is_possible_to_rearrange(s, t, k))

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)