2025-04-05:哈希分割字符串。用go语言,给定一个长度为 n 的字符串 s 和一个整数 k,其中 n 是 k 的倍数。我们的任务是把字符串 s 转换为一个长度为 n / k 的新字符串 result。
首先,将字符串 s 切分为 n / k 个子字符串,每个子字符串的长度为 k。接着,初始化 result 为一个空字符串。
接下来,我们逐个处理每个子字符串:
1.计算每个字符的哈希值,即它在字母表中的位置('a' 的位置是 0,'b' 是 1,依此类推到 'z' 是 25)。
2.求出子字符串中所有字符哈希值的总和。
3.将总和对 26 取余,得到一个值 hashedChar。
4.找到与 hashedChar 对应的小写字母。
5.将这个字母添加到 result 的末尾。
最终,返回 result。
1 <= k <= 100。
k <= s.length <= 1000。
s.length 能被 k 整除。
s 只含有小写英文字母。
输入:s = "abcd", k = 2。
输出:"bf"。
解释:
第一个字符串为 "ab" ,0 + 1 = 1 ,1 % 26 = 1 ,result[0] = 'b' 。
第二个字符串为: "cd" ,2 + 3 = 5 ,5 % 26 = 5 ,result[1] = 'f' 。
题目来自leetcode3271。
大体步骤如下:
-
输入参数:
- 输入的字符串
s是一个长度为n的小写字母字符串。 - 整数
k表示我们将字符串分割成子字符串的长度。 - 注意:
n必须是k的倍数,这样可以确保字符串可以被均匀切分。
- 输入的字符串
-
初始化结果:
- 创建一个空字符串
result,用于存放最终输出结果。
- 创建一个空字符串
-
字符串切分:
- 将字符串
s切分成n / k个子字符串,每个子字符串的长度都是k。例如,如果s = "abcd"和k = 2,则将其切分为两个子字符串:"ab"和"cd"。
- 将字符串
-
处理每一个子字符串:
- 对于每个长度为
k的子字符串,执行以下步骤:- 计算子字符串中每个字符的哈希值。哈希值定义为字符在字母表中的位置。例如,
'a'的哈希值为0,'b'的哈希值为1,依此类推,到'z'的哈希值为25。 - 将所有字符的哈希值相加,得到一个总和
sum。 - 将总和
sum对26取余,得到一个新的值hashedChar。 - 找到与
hashedChar对应的小写字母,将其作为结果字符。 - 将这个结果字符添加到
result字符串的末尾。
- 计算子字符串中每个字符的哈希值。哈希值定义为字符在字母表中的位置。例如,
- 对于每个长度为
-
返回结果:
- 最后,返回构建好的结果字符串
result。
- 最后,返回构建好的结果字符串
时间复杂度分析
- 字符串
s的长度为n,在最坏情况下,我们需要通过n / k次循环去处理每个子字符串,其中每个子字符串的处理包括遍历其中的k个字符。 - 因此,整体的时间复杂度是O(n),因为每个字符都只需被处理一次。
空间复杂度分析
- 在空间方面,我们主要使用一个
result字符串来存储最终结果,其长度为n / k。此外,切分过程以及数组存储的中间结果基本上是常数,因此不会占用额外的空间。 - 因此,整体的额外空间复杂度是 O(n/k),由于
n/k是相对于输入的,所以我们可以认为空间复杂度是 O(1),即除了输入和输出外,我们没有用到额外的空间。
综上,整体的时间复杂度为 O(n),额外空间复杂度为 O(1)。
Go完整代码如下:
package main
import (
"fmt"
)
func stringHash(s string, k int) string {
n := len(s)
ans := make([]byte, n/k)
for i := 0; i < n; i += k {
sum := 0
for _, b := range s[i : i+k] {
sum += int(b - 'a')
}
ans[i/k] = 'a' + byte(sum%26)
}
return string(ans)
}
func main() {
s := "abcd"
k := 2
result := stringHash(s, k)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def string_hash(s: str, k: int) -> str:
n = len(s)
ans = []
for i in range(0, n, k):
total = sum(ord(b) - ord('a') for b in s[i:i + k])
hashed_char = chr(ord('a') + total % 26)
ans.append(hashed_char)
return ''.join(ans)
if __name__ == '__main__':
s = "abcd"
k = 2
result = string_hash(s, k)
print(result)