szukanie podciągu o zadanych parametrach

0

mam problem. nie wiem czemu ale ten kod mi nie działa

#include <iostream>
#include <algorithm>
#include <functional>
#include<math.h>
#include<string.h>
using namespace std;
int main(void)
{
    ios_base::sync_with_stdio(0);
    int i=0,c=0,w=0;
    string b;
    cin>>b;
    char * a = new char[ b.size() + 1 ];
    i=b.length();
    strcpy( a, b.c_str() );
    while(1)
    {
        if(a[w]=='a')
        {
            c=c+1;
        }
        else if(a[w]=='b')
        {
            break;
        }
        w=w+1;
    }
    for(int o=0; o<i; o++)
    {
        if(a[o]=='b')
        {
            c=c+1;
        }
    }
    cout<<c;
}

zadanie ma taką treść:
Twoim zadaniem jest znalezienie w danym ciągu małych liter alfabetu angielskiego podciągu o najdłuższej długości który składa się tylko z liter a oraz b (w którym różne litery występują koło siebie co najwyżej w jednym miejscu np(aaabbb lub aaa).
wejście:
ciąg znaków o długości nie większej niż 100 000 znaków
Wyjście:
w jednym wierszu wyjścia powinna się znależć długość szukanego podciągu.
przykład:
wejście: afabdbda
wyjście: 4

0

Kod nie działa bo jest zupełnie bez sensu i nijak sie ma to zadanego problemu.

  1. Po co robisz jakies dziwne kopie tego stringa? Stringa można normalnie indeksować za pomocą []
  2. stringi są w <string> a nie <string.h>, to że ci to działa to akurat przypadek...
  3. Nie bierzesz w ogóle pod uwagę sytuacji że trafi ci sie inna literka niż a lub b a może...
  4. Jakim cudem w tym afabdbda jest podciąg długości 4? Podciągi które ja widzę:
    a zakończone na f
    ab zakończone na d
    b zakończone na d
    a zakończone końcem ciągu
    W efekcie ja tu widzę podciąg o długości 2 i nic więcej.
0

Nie musisz gromadzić danych, obrabiaj znak po znaku:

#include <cstdio>
using namespace std;

int main()
  {
   char ch;
   unsigned which=0,curr=0,max=0,cnt[2]={0};
   while((ch=getchar())!=EOF)
     {
      if((ch=='a')||(ch=='b'))
        {
         curr=(ch&1);
         if(which!=curr) cnt[which=curr]=0;
         ++cnt[which];
         curr=cnt[0]+cnt[1];
         if(max<curr) max=curr;
        }
     }
   printf("%u\n",max);
   return 0;
  }
0

http://ideone.com/idtKTI

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

int main(void) {
	char *input;
	scanf("%ms",&input);
	unsigned count = 0;
	size_t len = strlen(input);
	bool prev_aorb_too = false;
	while(len--) {
		if(!(input[len] == 'a' || input[len] == 'b')) {
			prev_aorb_too = false;
			continue;
		}
		if(prev_aorb_too) continue;
		++count; prev_aorb_too = true;
	}
	printf("%u\n",count);
	free(input);
	return 0;
}

(nie wiem czy to jest poprawnie). EDIT: a no już wiem. lepiej obrabiać znak po znaku

1 użytkowników online, w tym zalogowanych: 0, gości: 1