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("---") } }
代码说明
- 外层循环遍历每个字符作为子串的起始位置
start - 内层循环从
start+2开始遍历结束位置end,确保子串长度≥3 - 当首尾字符
s[start]与s[end]相等时,提取子串并更新计数map - 每个子串仅由其唯一的起始/结束索引生成,彻底避免重复计数
测试验证
- 输入
eabcacf:会正确统计abcac(1次)、cac(1次),无重复 - 输入
eabbcabcbf:cabc(起始索引2,结束索引5)仅被统计1次,不会重复
内容的提问来源于stack exchange,提问作者user21288564
相关产品推荐
相关产品推荐

