[c] porownywanie ciągów znaków

Sniegu
Użytkownik
Użytkownik
Posty: 10
Rejestracja: 17 lis 2015, o 00:05
Płeć: Mężczyzna
Lokalizacja: Polsza

[c] porownywanie ciągów znaków

Post autor: Sniegu »

Witam.
Za zadanie mam porównać wzorzec z łańcuchem. W wzorcu znak '?' znaczy dowolny znak a '*' dowolny ciąg znaków i zwrócić true lub false. Np:
ab??ca = abzzca
ta*ab=tazzzzzab

Problem pojawia się gdy jest do porównania:
ab*ab = abaaab.
Program po prostu bierze od razu kolejne 'a' i porownuje zamiast przeskoczyc do 'ab'.
Ukryta treść:    
Problem jest w tej części kodu. Dokładnie rozumiem błąd jednak nie mam bladego pojęcia jak go naprawić.

Kod: Zaznacz cały

case '*': //jak x dowolnych, to szukamy pierwszego znaku takiego jak następny po *
while ((Pos_chain < strlen(chain)) && (chain[Pos_chain] != module[Pos_mod + 1]))
Pos_chain++;
break;
Pozdrawiam.
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[c] porownywanie ciągów znaków

Post autor: jarzabek89 »

Problem dość ciekawy, rozwiązanie kłopotliwe.
Po pierwsze:
Dodawajmy do dowolnego ciągu literki tak długo, aż następna literka nie będzie odpowiadała literce z łańcucha. Chyba dość oczywiste. Cofnijmy się oczywiście później o jedną literkę.
To rozwiąże problem Twego typu, ale nie rozwiąże kolejnego problemu:
Porównajmy:
ab*ab = abaaabxab
Ten algorytm jako dowolny ciąg znaków potraktuje tylko aa, a powinien aabx.
Z tego nasuwają się różne pomysły. Może analizować tekst z dwóch stron?
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

[c] porownywanie ciągów znaków

Post autor: norwimaj »

Nie wiem, jaka złożoność Cię satysfakcjonuje, ale może Ci się to przyda:

Kod: Zaznacz cały

https://pl.wikipedia.org/wiki/Determinizacja_automatu_sko%C5%84czonego
. Może Twój przypadek jest trochę lepszy, niż dla dowolnego automatu.-- 17 lis 2015, o 19:01 --Dokładnie chodzi o to, że zamiast Pos_chain – pojednynczej pozycji w stringu, powinieneś przechowywać listę możliwych pozycji.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[c] porownywanie ciągów znaków

Post autor: Afish »

Bardzo prosta i dość elegancka implementacja wyrażeń regularnych jest tutaj:
U Ciebie trzeba zamienić kropkę na pytajnik.
ODPOWIEDZ