3271、[中等] 哈希分割字符串
1、题目描述
给你一个长度为 n
的字符串 s
和一个整数 k
,n
是 k
的 倍数 。你的任务是将字符串 s
哈希为一个长度为 n / k
的新字符串 result
。
首先,将 s
分割成 n / k
个 子字符串 ,每个子字符串的长度都为 k
。然后,将 result
初始化为一个 空 字符串。
我们依次从前往后处理每一个 子字符串 :
- 一个字符的 哈希值 是它在 字母表 中的下标(也就是
'a' → 0
,'b' → 1
,... ,'z' → 25
)。 - 将子字符串中字幕的 哈希值 求和。
- 将和对 26 取余,将结果记为
hashedChar
。 - 找到小写字母表中
hashedChar
对应的字符。 - 将该字符添加到
result
的末尾。
返回 result
。
2、代码实现
下面是这个问题的 C++ 代码实现:
class Solution {
public:
string stringHash(string s, int k) {
int n = s.size(); // 字符串的长度
int m = n / k; // 子字符串的数量
string ret; // 存储结果的字符串
for (int i = 0; i < m; i++) {
int sum = 0; // 初始化每个子字符串的哈希值总和
// 计算当前子字符串的哈希值
for (int j = 0; j < k; j++) {
sum += s[i * k + j] - 'a'; // 获取字符的下标值并求和
}
sum %= 26; // 对 26 取余
ret.push_back(sum + 'a'); // 将对应的字符添加到结果中
}
return ret; // 返回结果字符串
}
};
3、代码详解
- 变量定义:
n
:字符串s
的长度。m
:子字符串的数量,计算方法是n / k
。ret
:存储最终结果的字符串。
- 处理子字符串:
- 外层循环:遍历每个子字符串。
- 内层循环:遍历当前子字符串的每个字符,计算它们的哈希值总和。
- 对总和取余 26,得到
hashedChar
。 - 将
hashedChar
对应的字符添加到结果字符串ret
中。
- 返回结果:返回生成的哈希结果字符串
ret
。
4、总结
这个问题通过简单的字符串处理和数学运算实现了字符串的哈希转换。算法时间复杂度为 O(n),其中 n 是字符串的长度。这种方法高效且易于理解,非常适合用来解决类似的字符串处理问题。