字符串距离—2018年美团编程题

题目描述:给出两个相同的由字符a和b构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串“aab”与串“aba”的距离是2;串“ba”与串“aa”的距离是1;串“aba”与串”aba”的距离是0。下面给出两个字符串S和T,其中S的长度不小于T的长度。我们用|S|表示S的长度,用|T|表示T的长度,那么在S中一共有|S|-|T|+1个与T长度相同的子串,现在你需要计算T串与这些|S|-|T|+1个子串的距离的和。

输入:
第一行是字符串S
第二行是字符串T
S和T均由字符a和b组成,1<=|T|<=|S|<=10^5

例如:
输入
aba
aab
输出:
2

解法一:暴力破解
时间复杂度O(M*N),暴力破解只能通过70%。

#include<iostream>
#include<string>
using namespace std;
int main() {
    string s, t;
    cin >> s >> t;
    int slen = s.size();
    int tlen = t.size();
    int res = 0;

    for (int i = 0; i < slen - tlen + 1; i++) {
        int count = 0;
        for (int j = 0; j < t.size(); j++) {
            if (t[j] != s[j+i])
                count++;
        }
        res += count;
    }
    cout << res << endl;
    return 0;
}

解法二:
思路:关注到只有a、b两个字符,暴力破解不论有几种字符都能解决。
第一步,计算S中从第一个字符到第n个字符中的a(或b)的个数。
第二步,T中第i个字符只会跟S中的第i~(i+d)个字符进行比较,计算出所有这些比较的距离之和,并以这种方式遍历这个字符串T。
时间复杂度O(M+N)

#include<iostream>
#include<string>
using namespace std;
int pre[111111];
int main(){
    string s, t;
    cin >> s >> t;
    memset(pre, 0, sizeof(pre));
    for (int i = 0; i < s.size(); ++i){
        pre[i + 1] = s[i] == 'a' ? pre[i] + 1 : pre[i];
    }
    int ans = 0, d = s.size() - t.size() + 1;
    for (int i = 0; i < t.size(); ++i){
        if (t[i] == 'a'){
            ans += d - (pre[i + d] - pre[i]);//d-(pre[i+d] - pre[i])计算i-(i+d)中b的个数
        }
        else{
            ans += pre[i + d] - pre[i];
        }
    }
    cout << ans << endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值