hihocoder 1039 字符消除 C++程序

1 篇文章 0 订阅
本文介绍了一个使用C++解决hihocoder在线评测系统中关于字符消除的算法问题。博主通过遍历和消除字符串中重复字符的方法,实现了暴力求解策略,并希望看到更优解法的代码。主要涉及的编程技术和算法包括字符串操作和遍历搜索。
摘要由CSDN通过智能技术生成

这是我的第一篇博客额。

今天花了一下午时间折腾这道题,并不是因为题有多难,而是因为花了很多时间去寻找优化算法,结果无功而返。最后还是用蛮力法AC过了。算发思路就是遍历插入地点和插入字符,计算出所有情况下的字符数,输出最大消除字符个数。

废话不说,直接上代码,希望时间比我少的同学能分享一下代码。

#include<iostream>
#include<string>


using namespace std;


/*
输入:一个字符串的引用
输出:按照消除规则消除的字符数
说明:由于参数为引用类型,函数会破坏输入字符串
*/
int getResult(string &s)
{
int ol = s.length();
int i = 0, flag = 1;
while (flag == 1)
{
flag = 0;
while (i < s.length())
{
if (s[i] == s[i + 1])
{
while (s[i] == s[i + 1])
s.erase(i + 1, 1);
s.erase(i, 1);
flag = 1;
}
else
i++;
}
i = 0;
}
return ol - s.length();
}


/*
输入:s一个字符串,第i个字符后面,添加字符c
输出:返回按照消除规则的消除字符个数
说明:函数功能为计算在s字符串的i个字符后添加指定字符c所形成的字符串按照消除规则消除的字符个数
*/


int getWithAddChar(string s, int i, char c)
{
s.insert(i, 1, c);
return getResult(s);


}


/*
输入:s一个字符串的引用,i添加字符位置
输出:按照消除规则消除如果在第i个字符后添加字符的最大字符数
说明:函数功能为计算在s字符串的i个字符后添加所有可能的字符后,最大的消除字符个数
*/


int getWithAddPos(string &s, int i)
{
int maxn = 0, ct = 0;


for (char x = 'A'; x < 'D'; x++)
{
ct = getWithAddChar(s, i, x);
if (ct>maxn)
maxn = ct;
}
return maxn;


}


/*
输入:s一个字符串的引用
输出:按照添加和消除规则所消除的最大字符数
说明:
*/
int getWithAddStrategy(string &s)
{
int maxn = 0, ct = 0;
for (int i = 0; i <= s.length(); i++)
{




ct = getWithAddPos(s, i);
if (ct > maxn)
maxn = ct;


}
return maxn;
}


int main()
{
int x, y;
string *s;


cin >> y;


x = y;


//根据第一行输入分配内存
if (cin&&x > 0)
s = new string[x];


else return -1;




while (cin&&x && (x<101))
{
//输入字符串
cin >> s[--x];


//输入检查
for (int i = 0; i < s[x].length(); i++)
{
if (s[x][i]<'A' || s[x][i]>'C')
return -1;
}
if (s[x].length()>100)
return -1;
}


//计算并输出
for (x = y - 1; x >= 0; --x)
cout << getWithAddStrategy(s[x]) << endl;


//释放内存
delete[] s;


return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值