列表

详情


MT35. 字符串距离

描述

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

注意:子串指字符串中一段连续的串

数据范围:  ,字符串中仅包含 'a' , 'b'

输入描述

第一行包含一个字符串 S。

第二行包含一个字符串 T。
S和T均由字符a和b组成。

输出描述

输出对应的答案。

示例1

输入:

aab
aba

输出:

2

示例2

输入:

aaabb
bab

输出:

5

说明:

在样例 2 中,”aaa”与”bab”的距离为 2,”aab”与”bab”的距离为 1,”abb”与”bab”的距离为 2,
所以最后答案为 5。

原站题解

C 解法, 执行用时: 3ms, 内存消耗: 484KB, 提交时间: 2019-05-13

#include<stdio.h>
#include<string.h>
int main()
{
	char s[100000];
	char t[100000];
	scanf("%s%s",s,t);
	long long lens=strlen(s);
	long long lent=strlen(t);
	long long  numa, numb, total, pos;
	numa=numb=total=pos=0;

	int i,j;

	for (i=0; i<lens; ++i)
	{
        if (i<lent)
		{
            if (t[i] == 'a') 
				numa++;
            else 
				numb++;
        }
        if (s[i] == 'a') 
			total += numb;
        else 
			total += numa;
        if (i>=lens - lent)
		{
            if (t[pos++] == 'a')
				numa--;
            else 
				numb--;
        }
    }
	printf("%lld\n",total);
	return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 556KB, 提交时间: 2020-08-14

#include<stdio.h>
#include<string.h>
int main()
{
    char s[100000];
    char t[100000];
    scanf("%s%s",s,t);
    long long lens=strlen(s);
    long long lent=strlen(t);
    long long  numa, numb, total, pos;
    numa=numb=total=pos=0;
 
    int i,j;
 
    for (i=0; i<lens; ++i)
    {
        if (i<lent)
        {
            if (t[i] == 'a')
                numa++;
            else
                numb++;
        }
        if (s[i] == 'a')
            total += numb;
        else
            total += numa;
        if (i>=lens - lent)
        {
            if (t[pos++] == 'a')
                numa--;
            else
                numb--;
        }
    }
    printf("%lld\n",total);
    return 0;
}

上一题