Bạn tham khảo ở đây xem.Hy vọng giúp được bạn (Bạn hãy cố gắng tự phát triển nó lên): Đếm ra số ký tự giống nhau của một chuỗi
các bạn hướng dẫn qua cho mình về cách tìm số lần xuất hiện của 1 từ trong 1 chuỗi được nhập vào. vd: chuỗi "con cho con can con meo con", tìm từ: "con".in ra: có 4 từ con trong chuỗi.
Đã được chỉnh sửa lần cuối bởi dragoncl12 : 12-11-2007 lúc 08:58 PM.
Bạn tham khảo ở đây xem.Hy vọng giúp được bạn (Bạn hãy cố gắng tự phát triển nó lên): Đếm ra số ký tự giống nhau của một chuỗi
cám ơn bạn đã giúp, về việc kiểm tra kí tự thì mình ok rồi nhưng về cái việc xử lí từ mình nghĩ mãi chẳng ra cách giải quyết được.Mong các bạn giúp đỡ thêm.
Về bài này có rất nhiều cách làm, nhưng sau đây Dr đưa ra một thuật toán rất đơn giản như sau:
Giả sử ta cần tìm số lần xuất hiện chuỗi keyword="a1a2a3...an" trong chuỗi str="s1s2s3...sn" nào đó. Ta có thể làm như sau:
- Tìm vị trí trong str xuất hiện ký tự a1 của chuỗi keyword
- Tại mỗi vị trí xuất hiện ký tự a1 ta lấy ra một chuỗi có độ dài bằng độ dài của chuỗi keyword, lưu vào chuỗi temp.
- Đồng thời so sánh chuỗi keyword với chuỗi temp ở trên, nếu trùng thì counter++;
Bạn có thể dựa vào đây để phát triển hàm search được đó.
Chúc thành công!
Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
Phone: 0972 89 7667
Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.
Bạn tham khảo bài này nhé, đếm số kí tự trong 1 từ, còn đếm từ trong chuỗi thì để mình suy nghĩ lại xem nhé :
Java Code:
#include <iostream> #include <string> #define maxx 100 char word[256]; int alphaChar[maxx], upperChar[maxx]; int main() { /*Initialization*/ for ( int x = 0; x < 26; x++ ) { alphaChar[x] = 0; upperChar[x] = 0; } cout << "\nUser enter a word [no space] : "; cin >> word; cout << "\n\n\n"; int w = 0; do { for(int index = 0; index < (strlen(word)); index++) { if( word[index] == char(97 + w)) alphaChar[w]++; else if ( word[index] == char(65 + w)) upperChar[w]++; } w++; }while ( w != 26 ); for ( int i = 0; i < 26; i++ ) { if ( upperChar[i] != 0 ) cout << "the Char " << char(65 + i) << " occurences is : " << upperChar[i] << endl; else if ( alphaChar[i] != 0 ) cout << "the Char " << char(97 + i) << " occurences is :" << alphaChar[i] << endl; } return 0; }
Đã được chỉnh sửa lần cuối bởi rox_rook : 08-12-2008 lúc 09:54 AM.
Nếu ko có cách nào hay thì cứ brute force thôi (làm như Dr) với độ phức tạp là O(n*m) n - chiều dài text, m - chiều dài pattern.
Còn nếu muốn chạy nhanh hơn thì dùng KMP. Muốn vậy thì phải chịu khó nghiên cứu thôi.
Keep moving forward!
... Retired ...
Sorry Dragoncl12 ! Bữa h mới suy nghĩ ra, bạn thông cảm nhé ^^:
Cái chính là ta sử dụng hàm này "strstr" để lấy vị trí con trỏ của từ xuất hiện trong câu, mình có comment, bạn đọc sẽ hiểu ngay thôi ! Thân !C++ Code:
#include <iostream> #include <string> int main() { char word[80]; char *sentence = "The real courage is when you've clicked before you begin, and you will get through no matter what"; char *stringPtr = word; /*pointer stringPtr points to the first element of word (i.e) "y" ( you for e.g) */ char *tmpPtr = sentence; /*pointer tmpPtr points to the first element of sentence (i.e) "T"*/ char *VAR = NULL; /*Initialize pointer VAR points to NULL*/ int occurence = 0; int position; /*Take the length of the first word in sentence*/ int length = strlen(stringPtr); while(1) { /*strstr function returns a pointer to the first occurrence of "stringPtr" in "tmpPtr", or a null pointer if the "stringPtr" is not part of "tmpPtr". The matching process does not include the terminating null-characters.*/ VAR = strstr (tmpPtr, stringPtr); if( !VAR ) break; /*when this line is reached, "while loop" ends*/ position = VAR - tmpPtr; tmpPtr += position + length; /*tmpPtr points to the first character after seeking word*/ occurence++; /*Increase its occurence*/ } }
mình đang học mới [c] à ,chưa học c++ nên mình cũng chưa hiểu nhiều lắm nhưng dù sao cũng cảm ơn bạn rất nhiều ,nhất là cái bài đếm kí tựí , mình cũng đã giải ra bài này rồi cũng nhờ ý tưởng của bác Dreaminess đấy, nhưng mình ko hiểu sao lúc làm xong rồi chạy rất tốt ,nhưng đến chiều nó dở chứng chạy "chỉ đúng" bị lỗi với chuỗi "can con" tìm từ "con" là sai luôn
, mình gửi bài lên cho các bác sửa hộ nhé.
C Code:
#include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> #include <math.h> void main() { clrscr(); char *s,*t,*q; int i,j,dem=0,x=0,m=0,n,l,o=0; strlwr(s); strlwr(t); { { { if (s[i]==t[j]) { q[m++]=t[j]; x++; } else { m=0;x=0; } } { m=0;x=0;dem++; } else { m=0;x=0; } o=l+1; } } getch(); }
Đã được chỉnh sửa lần cuối bởi dragoncl12 : 25-11-2007 lúc 07:55 PM.
-Lúc khai báo bạn chưa chỉ ra bộ nhớ cho xâu s mà chỉ mới khai báo con trỏ chỉ tới xâu s mà thôi nên lúc nhập vào sẽ bị lỗi.Bạn chỉ cần khai báo một vùng nhớ cho các xâu s,t,q là được ví dụ:s[100],t[100],q[100]
-ở trước hàm gets(t) nên xóa bộ nhớ đệm bằng lệnh fflush(stdin)
ặc ặc, bạn đã chạy thử bài mình chưa và đúng cái chuỗi "can con" rồi tìm từ "con" ấy , nếu mà chạy được thì có lẽ trình borland c mình bị lỗi rồi. Mà công nhận thấy cái lỗi đúng bực kiểm tra với mấy cái chuỗi khác thì đúng,còn với cái chuỗi "can con" là lộn máu.
Đã được chỉnh sửa lần cuối bởi dragoncl12 : 25-11-2007 lúc 09:57 PM.