概述
题目
数据
3
aaaaaaaaaabbbbbbaa
aabbbbbbaaaaaaaaaa
abbaaa
答案21
思路
①判断各个字符串的基是否相同
AABBCC ->ABC
EEEEEEEEOO ->EO
所以先对各个代码进行去重然后逐一比较判断是否都相等
②如何求出赋值/删减的最小值?
首先我们由不完全归纳发现一个数列所有数字和中位数的差的绝对值累加和最小
所以我们可以将字符串进行分片处理
对于A部分,一二三的字符串对应数据分别是6,3,1找出中位数3
操作最少的次数就是6-3 + 3-1
然后又对B和C进行操作(别忘记排序)
代码
#include<iostream>
#include<algorithm>
#include<deque>
#include<cstring>
using namespace std;
//本题实际上是把字符串进行去重之后比较看是否相等,然后拿字符串长度来进行比较
//取得最小值应该是拿中间长度的数据来比大小
string duplicate(string a)//去重
{
int len = a.length();
deque<char> b;
b.push_back(a[0]);
for(int i = 1; i < len; i++)
{
if(a[i] == b.back())
{
continue;
}
else
{
b.push_back(a[i]);
}
}
string c;
for(deque<char>::iterator it = b.begin(); it != b.end(); it++)
{
c += *it;
}
return c;
}
bool cmp(int a, int b)
{
return (a < b);
}
int change_min(int *arrl,int t)//计算各个数据减去中位数的累加
{
int mid = t / 2;
int mid1 = mid;
if(!(t % 2))
{
mid1--;
}
long long times = 0;
for(int i = 0; i < mid; i++)
{
times += arrl[mid] - arrl[i];
}
for(int i = mid + 1; i < t; i++)
{
times += arrl[i] - arrl[mid];
}
long long times1 = 0;
for(int i = 0; i < mid1; i++)
{
times1 += arrl[mid1] - arrl[i];
}
for(int i = mid1 + 1; i < t; i++)
{
times1 += arrl[i] - arrl[mid1];
}
return (times > times1) ? times : times1;
}
int main()
{
int t;
cin >> t;
string *str = new string[t];
string *str1 = new string[t];
for(int i = 0; i < t; i++)
{
cin >> str[i];
str1[i] = duplicate(str[i]);
}
for(int i = 0; i < t - 1; i++)
{
if (str1[i] != str1[i + 1])
{
cout << "-1" << endl;
return 0;
}
}
int len = str1[0].length();
int * arrl = new int[t];//记录每个字符串对应分块的字符数量
int * location = new int[t];//记录位置
memset(arrl, 0 ,4 * t);
memset(location, 0 ,4 * t);
long long T = 0;
for(int i = 0; i < len; i++)//从基准数据开始分割
{
for(int j = 0; j < t; j++)//每个输入进来的字符串都要统计
{
int len = str[j].length();
for(;location[j] < len; location[j]++)//每个字符串的每个数字
{
if(str[j][location[j]] == str1[0][i])
{arrl[j]++;}
else
{break;}//
}
}
//统计好单个字符在各个字符串出现情况后后,开始找中位数并计算
sort(arrl , arrl + t, cmp);
T += change_min(arrl,t);
//重新初始化等下一个循环
memset(arrl, 0 ,4 * t);
}
cout << T << endl;
return 0;
}
最后
以上就是任性微笑为你收集整理的课后自主练习(字符串)1042. 字串变换 hard《编程思维与实践》个人学习笔记的全部内容,希望文章能够帮你解决课后自主练习(字符串)1042. 字串变换 hard《编程思维与实践》个人学习笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复