林贻民的博客

我的学习记录

字符串转换

题目描述

我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如”aaaa”是一个简单串,而”abcd”则不是简单串。现在给你一个仅由小写字母组成的字符串,你需要用最小的花费,将其转换成一个简单串。 花费的计算规则如下:将a到z这26个小写字母从左到右排成一排,则每个字母都有左右两个邻居,我们认为a的左邻居是z,z的右邻居是a。一个字母只能转换成其相邻的字母,转换的花费为1。一个字母可以进行多次转换,例如将a转换成d,可以进行如下的步骤: a->b->c->d,花费为3。字符串的转换花费为所有字母转换花费之和。例如将字符串”abbbz”转换成简单串的最小花费为3,转换后的结果为”bbbbb”。

输入格式

第一行一个整数T(T≤100),表示测试数据的组数。 每组测试数据只有一行,为仅含小写字母的字符串,字符串长度不超过1000。

输出格式

对于每一组数据,输出一个整数,表示将字符串转换成简单串的最小花费。

输入样例

2
abbba
abbac

输出样例

2
3

实现思路

1.以a为基准,b转换为a花费为1,转换为z花费为1,转换为c花费为2,转换为y花费为2,以此类推可以得到一个花费数组spend[13];
2.遍历一遍字符串数组str[N],得到字符串的长度length和每个字母出现的次数存储在character[26]数组中
3.遍历character[26]数组,对character[i]不为0(为零表示对应字母没有出现),进行转换,计算将字符串转换为character[i]对应字母的总花费,找出最小值。

代码实现

1.spend数组

for(i = 1, j = 25; i < 13, j > 13; i++, j--)
        {
            spend[i] = i;
            spend[j] = i;
        }

2.输入并遍历字符串

scanf("%s",str);
while(str[i] != '\0')
        {
        // 计算每个字母出现的次数
            character[str[i] - 'a'] += 1;
            length += 1;
            i++;
        }
        i = 0;

计算花费

int count = 0;
    //初始化最小值
        int min = 10000;
        for(i = 0; i < 26; i++)
        {
            if(character[i] != 0)
            {
                count = 0;
            // 计算总花费
                for(j = 0; j < 26; j++)
                {
                // 字母出现的次数×转换成相应字母的花费
                    if(i > j)
                        count += spend[i - j] * character[j];
                    else
                        count += spend[j - i] * character[j];
                }
                // 找出最小值
                if(min > count)
                    min = count;
            }
        }

完整代码


#include<stdio.h>
int main()
{
    int i,j,k;
    // 测试次数
    int N = 0;
    scanf("%d",&N);
    // 初始化费用
    int spend[26] = {0};
    spend[13] = 13;
    for(k = 0; k < N; k++)
    {
        // 字符串出现的次数
        int character[26] = {0};
        // 声明字符串
        char str[1001];
        // 字符串长度
        int length = 0;
        for(i = 1, j = 25; i < 13, j > 13; i++, j--)
        {
            spend[i] = i;
            spend[j] = i;
        }
        // 输入字符串
        scanf("%s",str);
        // 计算字符串长度和每个字母出现的次数
        i = 0;
        length = 0;
        while(str[i] != '\0')
        {
            character[str[i] - 'a'] += 1;
            length += 1;
            i++;
        }
        i = 0;
        int count = 0;
        int min = 10000;
        for(i = 0; i < 26; i++)
        {
            if(character[i] != 0)
            {
                count = 0;
                for(j = 0; j < 26; j++)
                {
                    if(i > j)
                        count += spend[i - j] * character[j];
                    else
                        count += spend[j - i] * character[j];
                }
                if(min > count)
                    min = count;
            }
        }
        printf("%d\n", min);
    }
    return 0;
}

运行实例

这里写图片描述

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lym152898/article/details/53991651
个人分类: C语言 上机
上一篇计算第X年Y月Z日是第X年的第几天
下一篇[转载]Ubuntu14.04系统中下载的中文文件名乱码解决办法
想对作者说点什么? 我来说一句

字符串转换工具2.5.4

2011年05月13日 282KB 下载

字符串转换为16进制char数组

2010年01月23日 9KB 下载

将xml字符串转换为datatable

2009年04月18日 2KB 下载

String 转换类

2013年11月20日 2KB 下载

字符串转换工具

2011年11月09日 642KB 下载

字符串转换小工具

2017年08月03日 1.02MB 下载

TransKing.rar

2011年08月26日 327KB 下载

字符串转换工具。。。。

2009年08月15日 668KB 下载

没有更多推荐了,返回首页

关闭
关闭