算法:两个字符串:abcdefg,10abcf,计算得出:位置0多出:10 位置3缺少:de 位置6错误,应为:gh

双循环解决:

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寻找相同的字符。

		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])
		}


```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值