Szukanie wzorca

0
Witam napisałem funkcje którą chciałem sprawdzić czy wzorzec znajduje się na jakiejs pozycji i chciałbym aby zwracała ta funkcja wartości boolowskie true or false.

Co udało mi się napisać:
	public boolean check(char [] T,int q,int k,char [] X){
		int s=0;
		for(int i=q;i<T.length;i++){ // idziemy po tekscie
			if(X[k-1]==T[q]){
				s+=q;// skok od poczatku po jakim znaleziono wzorzec
			for(int j=k;j<X.length;j++){
				while(X[k+q]==T[q]){
					q++;
				}
			}
		}
			//jak nie to zwiekszamy tekst
			q++;
	}
		
		return true;
		
	}

k = 1 oraz q=0 Tekst to tablica charow ze znakai Wzorzec to tablica charow rownież .

Bardzo proszę o pomoc z góry dziękuję

0

Ale w czym problem? I czemu nie użyjesz funkcji którą już ktoś napisał? o_O

0

tzn? Nie rozuiem a ta jes bardzo zła?

0

Pojęcia nie mam. Wstawiłeś kod z d**y i nie napisałeś co z nim jest nie tak. Mamy zgadywać?

0

Wygląda mi to na jakieś zaliczenie z przedmiotu programowania, jednakże spróbuj:

public class Test {
	public static void main(String[] args) {
		char[] string = {'a','b','b','c','c','c','c'};
		char[] pattern = {'a','b','b'};
		char[] pattern2 = {'b','b','c'};
		char[] pattern3 = {'c','b','c'};
		char[] pattern4 = {'a'};
		char[] pattern5 = {'d'};
		char[] pattern6 = {'c','c','c','c'};
		System.out.println(match(pattern,0,4,string));
		System.out.println(match(pattern2,1,5,string));
		System.out.println(match(pattern3,0,string.length,string));
		System.out.println(match(pattern4,0,5,string));
		System.out.println(match(pattern5,0,5,string));
		System.out.print(match(pattern6,0,string.length,string));
	}
	public static boolean match(char[] pattern, int begin, int end, char[] string) {
		if ( (begin > end) || (pattern.length > (end - begin)) ) return false;		
		for (int counter = begin; counter < end; counter++) {
			if (pattern[0] == string[counter]) {
				if (pattern.length == 1) return true;
				if ((counter + 1) == string.length) return false;
				int pattern_counter = 1;
				int string_counter = counter + 1;
				while (pattern[pattern_counter] == string[string_counter]) {
					if (pattern_counter == pattern.length - 1) return true;
					if (string_counter == string.length - 1) return false;
					pattern_counter++;
					string_counter++;
				}
			}
		}		
		return false;				
	}
}

Nie jest to zbyt optymalnie napisane i najlepiej skorzystaj z gotowego rozwiązania:

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#matches%28java.lang.String%29

0

implementacja programu ktory ma za zadanie wyszukac wystapienie wzorca w tekscie

0

Proponuję zacząć od napisania co oznaczają poszczególne parametry, bo na razie można się tylko domyślać.

0

Jasne całość sprowadza się do automatu skończonego...
tam znajduje się w pewnym momencie( w pseudokodzie czy Pq ] Pk a) i ta funkcja właśnie powinna chyba zwracać czy to słowo się znajduje w podanym tekście...
pseudokod znajduje się w książce Cormen i pewnie na wiki też powinien być

Wyszukałem pdf ponieważ sam posiadam tylko wydanie kartkowe zakupione w księgarni.
http://bmb.cu.edu.tr/caci/ftp/B%DDL453/Introduction_to_algorithms_3rd_edition.pdf

lub tutaj

http://compalg.inf.elte.hu/~tony/Oktatas/Parhuzamos-algoritmusok/List%20ranking/Almaangolul.pdf

34.3 Compute transition function konkretnie linijka nr 6 :)

Jeszcze jedną implementację zaprezentują którą napisałem:

	public boolean check(char T,int q,int k,char [] X){

		char [] Tabpom = new char[X.length-1];
		
		for(int i=0;i<Tabpom.length;i++){
			Tabpom[i] = X[k];
			k++;
		}
		int n = Tabpom.length;
		for(int i=0;i<Tabpom.length;i++){
			k=1;
			if(X[0]==T){
			while(i<Tabpom.length && Tabpom[i]==Tekst[k]){
				k++;
				i++;
			}
			if(i==Tabpom.length){
				return true;
			}
		}
	}
		return false;
}

Ok opowiem co miałem na myśli podczas implementacji:
Stworzenie tablicy pomocniczej w której przechowuje wzorzec od pozycji 1 bez pozycji zerowej.
Później sprawdzam czy podany do metody znak jest równy temu pierwszemu ze wzorca skoro tak to idziemy po kolejnych elementach tekstu aby sprawdzić czy będzie suffix(czyli tabpom) się z tym zgadzał jeżeli tak to zwracamy true natomiast w przeciwnym razie zwrócimy false.

@Edit zdaję sobie sprawę, że w Javie można użyć endWith(String); lecz tutaj wydaje mi się, że trzeba właśnie zaimplementować taką metodą do sprawdzania suffix a nie korzystanie z gotowej metody.

@Edit zgadzam się "String-matching automata" strona pseudokodu to 922 o ile dobrze pamiętam (2 link)

@Edit pomoże ktoś?

0

Przepisz ten kod na wersję "dla ludzi" a nie "dla maszyny". Programy mają być eleganckie i czytelne dla ludzi, a tylko incydentalnie uruchamiane na maszynie. Podpowiem ze nawy T, q, k, X, pom i alamakota to nie są dobre nazwy.

0
  public boolean check(char znak,int q,int k,char [] Wzorzec){
 
        char [] Suffix = new char[Wzorzec.length-1];
 
        for(int i=0;i<Suffix.length;i++){
            Suffix[i] = Wzorzec[k];
            k++;
        }
        int n = Wzorzec.length;
        for(int i=0;i<Suffix.length;i++){
            k=1;
            if(Wzorzec[0]==znak){
            while(i<Suffix.length && Suffix[i]==Tekst[k]){
                k++;
                i++;
            }
            if(i==Suffix.length){
                return true;
            }
        }
    }
        return false;
}

Może teraz ładniej to brzmi... :) Ogólnie wszystko opisałem wyżej jaki był zamysł
@Edit up

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