如何在Go语言中检测字符串是否包含指定子序列?
Go语言实现子序列检测函数
你需要的是检测字符串是否包含指定子序列(非连续子串),标准库的strings.Contains只能匹配连续的子串,无法满足需求。这里用双指针法实现一个符合要求的ContainsSubsequence函数:
package main import "fmt" func ContainsSubsequence(str, subStr string) bool { // 子序列为空直接返回true if subStr == "" { return true } subIdx := 0 for _, char := range str { if char == rune(subStr[subIdx]) { subIdx++ // 子序列所有字符都匹配完成 if subIdx == len(subStr) { return true } } } // 遍历完原字符串仍未匹配完子序列 return false } func main() { testCases := []struct { str string subStr string expected bool }{ {"cars", "car", true}, {"acasras", "car", true}, {"abc", "acb", false}, {"", "car", false}, {"car", "", true}, } for _, tc := range testCases { result := ContainsSubsequence(tc.str, tc.subStr) fmt.Printf("str: %q, subStr: %q, expected: %t, result: %t\n", tc.str, tc.subStr, tc.expected, result) } }
逻辑说明
- 用
subIdx作为子序列的遍历指针,原字符串通过range逐个遍历字符 - 当原字符串的字符与子序列当前指针位置的字符匹配时,将子序列指针后移一位
- 若子序列指针走完整个子序列长度,说明原字符串包含该子序列,返回
true - 若原字符串遍历完毕,子序列指针仍未走完,则返回
false
运行上述代码,"cars"和"acasras"都会正确返回true,完全符合你需要的^c^a^r^模式匹配需求。
内容的提问来源于stack exchange,提问作者amir.wpf
相关产品推荐
相关产品推荐

