求连续元素的多少

lc19890326 2008-05-16 07:26:10
并不是简单的求多少个连续元素

有一个字符串 可以看成是一串项链
里面有三种字母 r b w 相当于红黄白三种颜色的珠子
现在想找到这个项链的某一处
然后该处剪断
使从剪断处往两边数珠子,相同颜色的继续计数,直到遇到不同颜色就停止
白色可以看做是红色或者黄色
然后只需要输出可以得到珠子的数量

这个既然是项链 就可以循环的 也就算说最后一颗珠子后面是第一颗珠子

输入是珠子的总数量 和哪些珠子
输出是可以按照以上要求得到的珠子数量

输入
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
输出
11

wwwbbrwrbrbrrbrbrwrwwrbwrwrrb wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
****** *****
最后一个b和倒数第二个r是剪断处 相两边数 可以左边5个 右边6个

请问有没有什么比较好的算法
我的想法是用str, 然后str.append(),在一个一个遍历数珠子
但是感觉效率低 很暴力
请高手赐教

...全文
133 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ice_gream 2008-05-17
  • 打赏
  • 举报
回复
楼主有想过用链表做吗?可能要简单点吧!
最近我也忙到我的考勤系统没有时间,不过我看了哈上面的代码,问题应该不大.继续加油!
grellen 2008-05-17
  • 打赏
  • 举报
回复
smilecnf 2008-05-17
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
using namespace std;
//
int main()
{
string s;
string::iterator iter;
string::reverse_iterator riter;
int num=0;
char rch,lch;
cout<<"Input the string:"<<endl;
cin>>s;
iter=--s.end();
riter=++s.rbegin();
while(*iter=='w')
{
++iter;
if(iter==s.end()) iter=s.begin();
}
rch=*iter;
iter=--s.end();
while(*riter=='w')
{
++riter;
if(riter==s.rend()) riter=s.rbegin();
}
lch=*riter;
iter=--s.end();
riter=++s.rbegin();
while(*iter==rch||*iter=='w')
{
++num;
++iter;
if(iter==s.end())iter=s.begin();
}
while(*riter==lch || *riter=='w')
{
++num;
++riter;
if(riter==s.rend()) riter=s.rbegin();
}
cout<<endl<<num<<endl;
return 0;
}
其中有一组测试数据
77
rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
rwrwrwrwrwrwrwrwrwr
答案是72(正确)
不是74(错误)
77-5=72
c_spark 2008-05-17
  • 打赏
  • 举报
回复
正确是74
在字符的第29,30之间的分折
以前做过的一题目,用动态归划减少重复计算,顺便自己总结一下,呵呵~~
http://blog.csdn.net/c_spark/archive/2008/05/17/2454465.aspx
#include <stdio.h>
#include <string.h>

int getMax(int a, int b)
{
return a > b ? a : b;
}

int main()
{
int n,max;
int toLeft[1000][2];
int toRight[1000][2];
char str[500];
char tmp[1000];
scanf("%d%*c",&n);
gets(str);
strcpy(tmp,str);
strcat(tmp,str);
int i;
toRight[2*n][0] = 0;
toRight[2*n][1] = 0;
toLeft[0][0] = 0;
toLeft[0][1] = 0;
for(i = 1; i < 2*n; ++i)
{
if(tmp[i-1] == 'b')
{
toLeft[i][0] = toLeft[i-1][0] + 1;
toLeft[i][1] = 0;
}
else if(tmp[i-1] == 'r')
{
toLeft[i][0] = 0;
toLeft[i][1] = toLeft[i-1][1] + 1;
}
else if(tmp[i-1] == 'w')
{
toLeft[i][1] = toLeft[i-1][1] + 1;
toLeft[i][0] = toLeft[i-1][0] + 1;
}
}


for(i = n*2 - 1; i >= 0; --i)
{
if(tmp[i] == 'b')
{
toRight[i][0] = toRight[i+1][0] + 1;
toRight[i][1] = 0;
}
else if(tmp[i] == 'r')
{
toRight[i][0] = 0;
toRight[i][1] = toRight[i+1][1] + 1;
}
else if(tmp[i] == 'w')
{
toRight[i][1] = toRight[i+1][1] + 1;
toRight[i][0] = toRight[i+1][0] + 1;
}
}
max = 0;
int l,r;
for(i = 0; i < n*2; ++i)
{

l = getMax(toLeft[i][0],toLeft[i][1]);
r = getMax(toRight[i][0],toRight[i][1]);
max = getMax(max, l+r);
}
if(max > n) max = n;
printf("%d\n",max);
return 0;
}
lc19890326 2008-05-17
  • 打赏
  • 举报
回复
最后顶一次
自己写的代码如下

#include<iostream>
#include<string>
using namespace std;
bool IsRB(string str) //看str中是否同时含有b和r
{
int r=0,b=0;
for(string::size_type i=0;i!=str.size();++i)
{
if(str[i]=='r')
r=1;
if(str[i]=='b')
b=1;
}
if(b==1&&r==1)
return true;
else
return false;
}
int main()
{
int beads(string::size_type i,string str);
int n;
int max=0;
string str;
cin>>n;
cin>>str;
if(IsRB(str))
{
string str1=str;
str1.append(str); //将该字符串扩大一倍 达到循环的效果
for(string::size_type i=0;i!=str1.size();++i) //找该点的前向
{
int pcnt=0,ncnt=0;
for(string::size_type prev=i;prev!=-1;prev--)
{
char sprev=str1[i];
if(str1[prev]==sprev||str1[prev]=='w')
pcnt++;
else
break;
}
for(string::size_type next=i+1;next!=str1.size();++next)//找该点的后向
{
char snext=str1[i+1];
if(str1[next]==snext||str1[next]=='w')
ncnt++;
else
break;
}
if(max<(pcnt+ncnt))
max=pcnt+ncnt;

}
}
else
max=n;
cout<<max<<endl;
return 0;
}
}

其中有一组测试数据
77
rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
rwrwrwrwrwrwrwrwrwr
不对 我输出只有72
而应该是74
实在找不出原因了
lc19890326 2008-05-16
  • 打赏
  • 举报
回复

lc19890326 2008-05-16
  • 打赏
  • 举报
回复
继续顶
期待解答
herman~~ 2008-05-16
  • 打赏
  • 举报
回复
mark
lc19890326 2008-05-16
  • 打赏
  • 举报
回复
是ACM的简单题
但是不大会啊
哪位高手指教下
lc19890326 2008-05-16
  • 打赏
  • 举报
回复
ACM的简单题
但是不大会啊
顶一下
帅得不敢出门 2008-05-16
  • 打赏
  • 举报
回复
ACM 的貌似

65,197

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧