2025-04-05:哈希分割字符串。用go语言,给定一个长度为 n 的字符串 s 和一个整数 k,其中 n 是 k 的倍数。我们的任务是把字符串 s 转换为一

63 阅读3分钟

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。

大体步骤如下:

  1. 输入参数

    • 输入的字符串 s 是一个长度为 n 的小写字母字符串。
    • 整数 k 表示我们将字符串分割成子字符串的长度。
    • 注意:n 必须是 k 的倍数,这样可以确保字符串可以被均匀切分。
  2. 初始化结果

    • 创建一个空字符串 result,用于存放最终输出结果。
  3. 字符串切分

    • 将字符串 s 切分成 n / k 个子字符串,每个子字符串的长度都是 k。例如,如果 s = "abcd"k = 2,则将其切分为两个子字符串:"ab""cd"
  4. 处理每一个子字符串

    • 对于每个长度为 k 的子字符串,执行以下步骤:
      • 计算子字符串中每个字符的哈希值。哈希值定义为字符在字母表中的位置。例如,'a' 的哈希值为 0'b' 的哈希值为 1,依此类推,到 'z' 的哈希值为 25
      • 将所有字符的哈希值相加,得到一个总和 sum
      • 将总和 sum26 取余,得到一个新的值 hashedChar
      • 找到与 hashedChar 对应的小写字母,将其作为结果字符。
      • 将这个结果字符添加到 result 字符串的末尾。
  5. 返回结果

    • 最后,返回构建好的结果字符串 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)

在这里插入图片描述