Informatică, întrebare adresată de ochiuverde, 9 ani în urmă

am problema urmatoare:
Se consideră alfabetul compus din literele mici, de la a la z, fără diacritice. Se numeşte cuvânt un şir finit, eventual vid, de litere din alfabet. Se numeşte mască un şir de caractere din alfabet având eventual în plus caracterele ? şi * cu următoarea semnificaţie: caracterul ? înlocuieşte oricare din literele de la a la z (o singură literă) iar caracterul * înlocuieşte un cuvânt oarecare, eventual vid, format cu litere de la a la z.

Spre exemplu avem masca a?b*c. Dacă avem 3 cuvinte şi anume abbc, acbaac şi abac atunci primele 2 se potrivesc cu masca.
se gaseste pe pb info si nu stiu cum sa fac codul.

Răspunsuri la întrebare

Răspuns de express
1
Am sa-ti dau solutia oficiala a acestei probleme. Succes!
program sablon;
var fisier,g:text;
exp,s:string;
n,i,j,k:integer;
p:integer;
gasit:boolean;
x:array[1..1000]of string;

function f(exp,s:string):boolean;
var i:integer;ok:boolean;
begin
if exp='' then if s='' then f:=true
                       else f:=false
          else
 if (exp[1]>='a')and(exp[1]<='z') then
  if s<>'' then
   if s[1]=exp[1] then
                    begin
                    delete(exp,1,1);
                    delete(s,1,1);
                    f:=f(exp,s)
                    end
                  else {s[1]<>exp[1]} f:=false
           else {s=''} f:=false
 else
  if exp[1]='?' then
   if s<>'' then
              begin
              delete(exp,1,1);
              delete(s,1,1);
              f:=f(exp,s)
              end
            else f:=false
  else {exp[1]='*'}
   begin
   delete(exp,1,1);
   ok:=f(exp,s);
   for i:=1 to length(s) do
    begin
    delete(s,1,1);
    ok:=ok or f(exp,s);
    end;
   f:=ok;
   end;
end;

begin
assign(fisier,'masca.in');
reset(fisier);
readln(fisier,p);
readln(fisier,exp);
readln(fisier,n);
if p=2 then
begin
k:=0;
for i:=1 to n do
 begin
 readln(fisier,s);
 if f(exp,s) then
  begin
  gasit:=false;
  for j:=1 to k do
   if s=x[j] then gasit:=true;
  if not(gasit) then
   begin inc(k);
   x[k]:=s;
   end;
  end;
 end;
close(fisier);
end
else
begin
k:=0;
for i:=1 to n do
 begin
 readln(fisier,s);
  begin
  gasit:=false;
  for j:=1 to k do
   if s=x[j] then gasit:=true;
  if not(gasit) then
   begin inc(k);
   x[k]:=s;
   end;
  end;
 end;
close(fisier);
end;

{writeln(exp);
for j:=1 to k do
 writeln(x[j],' DA');

writeln('nr=',k);}

assign(g,'masca.out');
rewrite(g);
writeln(g,k);
close(g);
end.



ochiuverde: imi poti spune te rog daca gasesc si sursa in c++?
Alte întrebări interesante