
2026-06-23:合并靠近字符。用go语言,现有仅含小写字母的字符串s与整数k,规则说明如下:
1 <= s.length <= 100。
1 <= k <= s.length。
s 由小写英文字母组成。
输入: s = "yybyzybz", k = 2。
输出: "ybzybz"。
解释:
下标 i = 0 和 i = 1 处的字符 'y' 是靠近的,因为 1 - 0 = 1 <= k。
将它们合并到左侧的 'y',得到 s = "ybyzybz"。
现在下标 i = 0 和 i = 2 处的字符 'y' 是靠近的,因为 2 - 0 = 2 <= k。
将它们合并到左侧的 'y',得到 s = "ybzybz"。
没有其他相同的字符是靠近的,因此不再发生合并。
题目来自力扣3853。
好的,我们先按照题目规则和提供的代码,一步步分析这个合并过程的逻辑,并对比题目描述来验证。
k,就认为它们“靠近”。注意:合并后字符串长度减 1,后续位置索引会重新计算。
提供的 mergeCharacters 函数做的是一次遍历过滤重复字符,不是模拟题目描述的“循环合并”。它的核心逻辑是:
last[26] 数组,记录每个字母最近一次被保留在结果中的位置。k,就保留它,并更新 last;这个逻辑相当于:
初始字符串:"yybyzybz",k=2,索引从 0 开始:
"ybyzybz"(删除了原索引1的 y)"ybyzybz"索引: 0: y 1: b 2: y 3: z 4: y 5: b 6: z
现在找最近的可合并对:
"ybzybz""ybzybz"索引: 0: y 1: b 2: z 3: y 4: b 5: z
检查所有相同字符对:
最终结果:"ybzybz",与题目输出一致。
最终答案:
.
package main
import (
"fmt"
)
func mergeCharacters(s string, k int)string {
last := [26]int{}
for i := range last {
last[i] = -k - 1// 保证首次遇到字母 i 时,len(ans)-last[i] > k 是 true
}
ans := []byte{}
for _, ch := range s {
// ch 在 ans 中的下标是 len(ans)
iflen(ans)-last[ch-'a'] > k {
last[ch-'a'] = len(ans)
ans = append(ans, byte(ch))
}
}
returnstring(ans)
}
func main() {
s := "yybyzybz"
k := 2
result := mergeCharacters(s, k)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def merge_characters(s: str, k: int) -> str:
# 初始化 last 数组,每个字母的上次出现位置,初始值设为 -k-1
last = [-k - 1] * 26
ans = []
for ch in s:
idx = ord(ch) - ord('a')
# 如果当前字符与上次出现位置的距离大于 k,则保留
iflen(ans) - last[idx] > k:
last[idx] = len(ans)
ans.append(ch)
return''.join(ans)
if __name__ == "__main__":
s = "yybyzybz"
k = 2
result = merge_characters(s, k)
print(result)
.
#include <iostream>
#include <string>
#include <vector>
std::string mergeCharacters(const std::string& s, int k) {
// 初始化 last 数组,每个字母的上次出现位置,初始值设为 -k-1
std::vector<int> last(26, -k - 1);
std::string ans;
for (char ch : s) {
int idx = ch - 'a';
// 如果当前字符与上次出现位置的距离大于 k,则保留
if (static_cast<int>(ans.size()) - last[idx] > k) {
last[idx] = static_cast<int>(ans.size()); // 记录加入前的索引(即新字符的下标)
ans.push_back(ch);
}
}
return ans;
}
int main() {
std::string s = "yybyzybz";
int k = 2;
std::string result = mergeCharacters(s, k);
std::cout << result << std::endl;
return0;
}
