You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串中重复出现的子串替换为仅保留最后一次出现?

实现思路与代码示例

刚好碰到过类似的需求!要实现仅保留每个子串最后一次出现的效果,核心思路其实很简单:从字符串的末尾往前遍历,记录已经保留过的子串,这样就能确保我们只留下每个子串的最后一次出现,再把收集到的结果反转回来即可得到目标字符串。

下面用Python代码来具体实现:

input_str = "1-string-2-string-3-string-55-otherstring-66-otherstring"

# 1. 把字符串按"-"拆分成子串列表
parts = input_str.split("-")
# 2. 从后往前遍历,用集合记录已经保留的子串
seen = set()
result_parts = []
for part in reversed(parts):
    if part not in seen:
        seen.add(part)
        result_parts.append(part)
# 3. 反转结果列表,再用"-"拼接成最终字符串
output_str = "-".join(reversed(result_parts))

print(output_str)  # 输出结果: 1-2-3-string-55-66-otherstring

代码逻辑解释

  • 拆分字符串:用split("-")把原始字符串分割成独立的子串列表,方便逐个处理每个元素。
  • 反向遍历去重:从最后一个子串开始往前扫,用集合seen标记已经加入结果的子串。如果当前子串还没被记录过,就把它加入结果列表并标记为已见过——这一步就保证了只有最后一次出现的子串会被保留下来。
  • 反转拼接:因为我们是从后往前收集的子串,所以最后需要把结果列表反转,再用-拼接成符合要求的最终字符串。

如果用JavaScript实现,思路完全一致,代码如下:

const inputStr = "1-string-2-string-3-string-55-otherstring-66-otherstring";

const parts = inputStr.split("-");
const seen = new Set();
const resultParts = [];

// 从末尾开始遍历子串列表
for (let i = parts.length - 1; i >= 0; i--) {
    const part = parts[i];
    if (!seen.has(part)) {
        seen.add(part);
        resultParts.push(part);
    }
}

// 反转结果列表并拼接
const outputStr = resultParts.reverse().join("-");
console.log(outputStr); // 输出: 1-2-3-string-55-66-otherstring

这种方法的时间复杂度是O(n)(n为子串的总数),效率很高,而且逻辑清晰,不管是调试还是维护都很方便。

内容的提问来源于stack exchange,提问作者MagicHat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:00:29