如何将字符串中重复出现的子串替换为仅保留最后一次出现?
实现思路与代码示例
刚好碰到过类似的需求!要实现仅保留每个子串最后一次出现的效果,核心思路其实很简单:从字符串的末尾往前遍历,记录已经保留过的子串,这样就能确保我们只留下每个子串的最后一次出现,再把收集到的结果反转回来即可得到目标字符串。
下面用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
相关产品推荐
相关产品推荐

