Code đếm số lần xuất hiện của xâu x trong xâu S bị sai

Đề bài: nhập từ bàn phím một chuỗi S, sau đó nhập vào một chuỗi x. Xác định số lần x xuất hiện trong S.

Code của mình:

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

int CountString(char source[], char target[]);

int main()
{
	char s[255], x[255];
	
	printf("S:\n");
	fflush(stdin);
	gets(s);
	printf("x:\n");
	fflush(stdin);
	gets(x);
	
	printf("x xuat hien %d lan",CountString(s,x));
}

int CountString(char source[], char target[])
{
	int i=0;
	int j=0;
	int count=0;
	
	while(i<strlen(source))
	{
		if(source[i]==target[j])
			j++;
		else
			j=0;
		if(j==strlen(target))
		{
			count++;
			j=0;
		}
		i++;
	}
	return count;
}

Sau khi test nhiều lần, mình gặp vấn để ở lần test sau:

S:     long     long     lo

x:lo (trả về 3)
x: lo (trả về 3)
x:  lo (trả về 3)
x:   lo (trả về 0)
x:    lo (trả về 0)

Mình đã nghiền ngẫm rất kĩ mà chưa tìm ra chỗ sai. @@

i chạy đến dấu cách thứ 4 thì thấy không khớp. nên j bị reset. lúc này i đã chạy quá khoảng 3 dấu cách, nên so sánh không khớp được nữa.

2 Likes

Bạn nên thêm 1 vòng lặp để so sánh bên trong nữa.

2 Likes

Mình sửa như này:

int CountString(char source[], char target[])
{
	int i=0;
	int j=0;
	int count=0;
	
	while(i<strlen(source))
	{
		if(source[i]==target[j])
			j++;
		else
		{
			i-=j;
			j=0;
		}
		if(j==strlen(target))
		{
			count++;
			j=0;
		}
		i++;
	}
	return count;
}

Bạn xem giúp mình có còn bug không?

So sánh bên trong tức là sao hả bạn?

theo mình nghĩ, bây giờ bạn phải lưu lại vị trí đâu tiền nó trùng nhau, nếu sai thì xét tiếp từ vị trí đó + 1, mới đúng

2 Likes

Mình cũng mới nghĩ ra, code như này bạn xem được chưa, mình test thì không còn lỗi đó nữa.

if(source[i]==target[j])
     j++;
else
{
     i-=j;
     j=0;
}

bạn code như vậy là sai tư tưởng rồi.
bạn nên tìm duyệt toàn bộ chuỗi source, rồi so sánh phần tử đầu tiên của target với phần tử trong source, nếu giống thì tạo vòng lặp so sánh tiếp các phần tử trong target, nếu không thì next qua thôi
bạn nên nghĩ thêm vài case đặc biêt vd như: source = “ababacd”; target = “aba” thì kết quả như nào, …

2 Likes
S:
ababacd
x:
aba
x xuat hien 1 lan

Không biết do may mắn hay gì nhưng vẫn ra bạn ơi

Kết quả là 2 mà bạn :3

3 Likes

Mình tư duy kiểu này:
S: ababacd gồm aba + ba + cd
hoặc ab + aba + cd
Nên nếu tìm x: aba thì chỉ tìm ra được 1.
Mục đích bài này của mình là xác định x có là 1 chuỗi con của S hay không? Nếu có thì xuất hiện mấy lần?

Do bạn code sai thôi :grin:

Bạn cứ làm đơn giản thôi, là đếm xem có bao nhiêu chỉ số iS[i..i+l-1] == x (x có độ dài l).

2 Likes

Bạn cắt nghĩa rõ hơn cho mình được không? :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?