双循环解决:
func compareStrings(str1 string, str2 string) {
len1 := len(str1)
len2 := len(str2)
idx1 := 0
idx2 := 0
for i := 0; i < len1; i++ {
for j := idx2; j < len2; j++ {
if str1[i] == str2[j] {
if j > idx2 && i == idx1 {
fmt.Printf("位置%d多出:%s\n", i, str2[idx2:j])
idx1++
idx2 = j + 1
} else if i > idx1 && j == idx2 {
fmt.Printf("位置%d缺少:%s\n", idx1, str1[idx1:i])
idx1 = i + 1
idx2++
} else if i > idx1 && j > idx2 {
fmt.Printf("位置%d错误,应为:%s\n", idx1, str1[idx1:i])
idx1 = i + 1
idx2 = j + 1
} else {
idx1++
idx2++
}
break
}
}
if i == (len1-1) && (idx1 < len1) {
fmt.Printf("位置%d错误,应为:%s\n", idx1, str1[idx1:i+1])
}
}
}
解析
```
取 idx1和idx2作为滑动窗口起点。以 str1 字符串1为基准,遍历str2字符串2寻找相同的字符。文章来源地址https://www.toymoban.com/news/detail-640267.html
idx1 = 0;
idx2 = 0;
for i := 0; i < len1; i++ {
for j := idx2; j < len2; j++ {
if(str1[i] == str2[idx2]){
// 匹配上了;但是可能位置不对, 这里就要分 多种情况
1、 多出字符串:
str2的循环下标 j > idx2 && i == idx1, : 这种情况就是 2个循环下标的内容相同, 但是 str2 循环体位置 要大于 str2基准位置, 并且 上一层的str1 循环体位置和基准值idx1是一致的,
那就证明 j > idx2 , 就是多出来的值;
判断完后:
idx1 ++;
inx2 = j +1;
2、缺少字符串: i > idx1 && j == idx2
如果 str1 循环 下标i 要大于 str1 的基准 但是 str2的循环下标等于 str2的基准值
那就证明 str2 缺少了数据, 缺少的内容为:idx1 -> i 之间的内容
判断完后:
idx1 = i + 1;
idx2 ++;
3、位置错误; i > idx1 && j > idx2
str1的循环体位置 大于 str1基准值,并且 str2的循环体 大于 str2的基准值,
说明两个字符串相同字符前,各有一段不相同字符
那就是实际上 str1 上基准位置: idx1 的位置上值应该是: idx1 -> i 之前的距离;
简单理解就是: 循环体 循环的时候,值相同, 但是都不等于实际的 基准位置,已第一层str1循环作为判断,那就str1 实际位置应该是啥,但是str2并不是;
判断完后:
idx1++;
idx2++;
4、break 如果三个条件都不满足 证明碰到了连续字符串
将 idx1++; idx2++; 再 break即可
}
}
// 第一层,每循环一次, 判断一下:
// 如果 外层 已经循环到结尾了, 但是基准下标 仍然 要比 第一层字符串的长度小,
// 那么证明 str2 和 str1长度不匹配,
// 多出的内容的第一层str1 基准值 到最后的位置的值 ,
if i == (len1-1) && (idx1 < len1) {
fmt.Printf("位置%d错误,应为:%s\n", idx1, str1[idx1:i+1])
}
```
文章来源:https://www.toymoban.com/news/detail-640267.html
到了这里,关于算法:两个字符串:abcdefg,10abcf,计算得出:位置0多出:10 位置3缺少:de 位置6错误,应为:gh的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!