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

Go语言子串统计程序异常:非连续重复子串计数错误求助

Go语言子串重复计数问题修复方案

问题诊断

你遇到的重复计数问题,核心是子串枚举逻辑错误:如果依赖strings.Index配合字符串截断的方式查找子串,会导致同一个内容的子串在不同截断后的字符串中被重复识别;或者初始枚举逻辑没有基于固定的起始/结束索引生成子串,而是通过滑动、匹配的方式重复捕获了相同内容的子串。

正确实现思路

要避免重复计数,应该基于字符串的索引对生成所有符合条件的子串:遍历所有可能的起始索引i,再从i+2(保证子串长度≥3)开始遍历结束索引j,当s[i] == s[j]时,提取子串s[i:j+1]并统计次数。这种方式每个符合条件的子串对应唯一的(i,j)索引对,不会出现重复统计。

修正后的代码

package main

import (
	"fmt"
)

func countValidSubstrings(s string) map[string]int {
	counts := make(map[string]int)
	strLen := len(s)

	// 遍历所有起始位置
	for start := 0; start < strLen; start++ {
		// 结束位置至少要比start大2,保证子串长度≥3
		for end := start + 2; end < strLen; end++ {
			if s[start] == s[end] {
				subStr := s[start : end+1]
				counts[subStr]++
			}
		}
	}

	return counts
}

func main() {
	testCases := []string{"abbabba", "abcacba", "eabcacf", "eabbcabcbf"}
	for _, input := range testCases {
		fmt.Printf("输入字符串: %s\n", input)
		result := countValidSubstrings(input)
		for sub, cnt := range result {
			fmt.Printf("子串「%s」出现次数: %d\n", sub, cnt)
		}
		fmt.Println("---")
	}
}

代码说明

  1. 外层循环遍历每个字符作为子串的起始位置start
  2. 内层循环从start+2开始遍历结束位置end,确保子串长度≥3
  3. 当首尾字符s[start]与s[end]相等时,提取子串并更新计数map
  4. 每个子串仅由其唯一的起始/结束索引生成,彻底避免重复计数

测试验证

  • 输入eabcacf:会正确统计abcac(1次)、cac(1次),无重复
  • 输入eabbcabcbf:cabc(起始索引2,结束索引5)仅被统计1次,不会重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:14