• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

So sánh chuỗi trong VB

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Moderators: tungblt, vuathongtin

r3turn
Posts: 8
Joined: Tue 29/05/2012 10:54 am

So sánh chuỗi trong VB

Postby r3turn » Wed 29/08/2012 3:59 pm

Mọi người cho mình hỏi làm sao để so sánh 1 chuỗi kiểu như sau

Dữ liệu

Code: Select all

@Ngày mai tôi phải đi làm
@Hôm nay là ngày đầu tuần
@Trách nhiệm hữu hạn
@Con đường đời


ví dụ dữ liệu của mình đưa vào là

Code: Select all

Trách nhiệm với tương lai


nếu thấy khớp với trên 30% thì sẽ xuất ra textbox



User avatar
akira
Thành viên danh dự
Thành viên danh dự
Posts: 354
Joined: Sat 25/10/2008 11:11 pm
Has thanked: 6 times
Been thanked: 69 times

Re: So sánh chuỗi trong VB

Postby akira » Wed 29/08/2012 4:31 pm

khớp 30% thì lấy mới ác chứ :))

bạn thử đưa hết chuỗi input vào một mảng (cắt theo khoảng trắng)
muốn lẹ thì sử dụng linq duyệt từng chữ một xem chữ đó có nằm trong chuỗi ko, nếu hơn 30% số chữ trong mảng thỏa thì xuất ra textbox :D

User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 380 times
Contact:

Re: So sánh chuỗi trong VB

Postby xuanha » Wed 29/08/2012 4:37 pm

1. Duyệt từng dòng, lấy len(của chuỗi)*3/100 nếu lẻ thì làm tròn số này
2. Lấy 1 biến i cho chạy từ 1 đến len(xâu nhập vào) từ đi len(của chuỗi)*3/100
Cắt xâu nhập vào từ vị trí i và lấy độ dài là len(của chuỗi)*3/100 nếu lẻ thì làm tròn số này
3. Kiểm tra xâu được cắt này nếu nó nằm trong chuỗi thì in chuỗi đó ra.

Bạn hãy tham khảo đoạn code dưới đây:
  1. Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         Dim x() As String = {"@Ngày mai tôi phải đi làm", "@Hôm nay là ngày đầu tuần", "@Trách nhiệm hữu hạn", "@Con đường đời", "Trách nhiệm với com cjauy"}
  3.         MsgBox(kiemtra(x, "Trách nhiệm với tương lai"))
  4.     End Sub
  5.     Private Function kiemtra(ByVal s() As String, ByVal dulieu As String) As String
  6.         Dim x$ = ""
  7.         Dim i%
  8.         Dim j%
  9.         For i = 0 To UBound(s)
  10.             For j = 1 To Math.Round(dulieu.Length() - s(i).Length * 0.3)
  11.                 If s(i).IndexOf(Mid(dulieu, j, Math.Round(s(i).Length * 0.3)), 1) > 0 Then x = x & s(i) & vbCrLf
  12.             Next
  13.         Next
  14.         kiemtra = x
  15.     End Function
  16.  
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599

r3turn
Posts: 8
Joined: Tue 29/05/2012 10:54 am

Re: So sánh chuỗi trong VB

Postby r3turn » Wed 29/08/2012 7:33 pm

Cảm ơn bạn.
cho mình hỏi thêm 1 câu nữa nha :)

làm thế nào để so sánh 2 từ và đưa ra nó giống nhau bao nhiêu phần trăm không.

ví dụ như này :

Code: Select all

http://2cafe.vn/kiemtra.php?v1=Đây là chuỗi 1&v2=Đây là từ cần so sánh


nó sẽ trả về kết quả là 54.16 %

Cảm ơn mọi người :D

User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 380 times
Contact:

Re: So sánh chuỗi trong VB

Postby xuanha » Wed 29/08/2012 8:46 pm

Ai cũng biết 10% của 100 là mười, 40% của 100 là 25. Vậy thì suy ra hai chuỗi giống nhau bao nhiêu % bằng độ dài của đoạn ký tự giống nhau chia cho độ dài chuỗi cần so sánh.
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599

User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

Re: So sánh chuỗi trong VB

Postby dazzlingvit » Wed 29/08/2012 11:38 pm

xuanha wrote:1. Duyệt từng dòng, lấy len(của chuỗi)*3/100 nếu lẻ thì làm tròn số này
2. Lấy 1 biến i cho chạy từ 1 đến len(xâu nhập vào) từ đi len(của chuỗi)*3/100
Cắt xâu nhập vào từ vị trí i và lấy độ dài là len(của chuỗi)*3/100 nếu lẻ thì làm tròn số này
3. Kiểm tra xâu được cắt này nếu nó nằm trong chuỗi thì in chuỗi đó ra.

Cách này không chính xác (tên gọi "mỹ miều" của các giải toán này là thuật toán tham lam - Greedy Algorithm). Bởi vì nếu 2 xâu là: "Luyên thuyên" và "Liên thiên", các ký tự giống và khác nhau nó xen lẫn nhau, vì thế nếu mà cắt từng phần của xâu đem đi so sánh kết quả nó sẽ sai :)
----------------
r3turn wrote:Cảm ơn bạn.
cho mình hỏi thêm 1 câu nữa nha :)

làm thế nào để so sánh 2 từ và đưa ra nó giống nhau bao nhiêu phần trăm không.

ví dụ như này :

Code: Select all

http://2cafe.vn/kiemtra.php?v1=Đây là chuỗi 1&v2=Đây là từ cần so sánh


nó sẽ trả về kết quả là 54.16 %

Cảm ơn mọi người :D

Đây là bài toán tìm xâu con chung dài nhất, là bài toán sử dụng thuật toán quy hoạch động (Dynamic Programming) cơ bản mà bạn có thể gặp ở bất cứ cuốn sách thuật toán nào. Tư tưởng thuật toán nó như sau:
- Gọi 2 xâu đó là s1 và s2. Gọi dp[i][j] là độ dài xâu con chung dài nhất của i ký tự đầu của s1 và j ký tự đầu của s2. Dễ thấy các dp[0][j] và dp[i][0] đều bằng 0 (xong bước khởi tạo).
- Quy hoạch động: nếu s1[i] = s2[j] thì thấy ngay xâu con chung dài nhất lúc đó sẽ là xâu con chung dài nhất của s1, s2 bỏ đi phần tử đang xét cộng với 1. Tức là dp[i][j] = dp[i - 1][j - 1] + 1. Ngược lại (s1[i] != s2[j]), dp[i][j] = Max{dp[i - 1][j], dp[i][j - 1]}
- Độ dài xâu con chung dài nhất nó nằm ở dp[n][m] với n là độ dài s1, m là độ dài s2. Muốn tìm chính xác xâu này thì tạo thêm cái mảng truy vết.
Độ phức tạp O(n*m).
Nói chung là kiếm cuốn sách về giải thuật mà đọc, chắc dễ hiểu hơn đống phía trên mình viết :D
Dazzling V.I.T
Hãy gọi tôi là vịt :)

r3turn
Posts: 8
Joined: Tue 29/05/2012 10:54 am

Re: So sánh chuỗi trong VB

Postby r3turn » Fri 31/08/2012 8:25 pm

hi, mình với học nên vẫn còn non và xanh lắm :(. mình tìm mãi mà ko thấy ở đâu cả :(

ai giúp mình với :D

User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

Re: So sánh chuỗi trong VB

Postby dazzlingvit » Fri 31/08/2012 9:19 pm

Lên google gõ "Tìm xâu con chung dài nhất" là ra cả đống.
Dazzling V.I.T
Hãy gọi tôi là vịt :)

User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 380 times
Contact:

Re: So sánh chuỗi trong VB

Postby xuanha » Fri 31/08/2012 9:57 pm

r3turn wrote:hi, mình với học nên vẫn còn non và xanh lắm :(. mình tìm mãi mà ko thấy ở đâu cả :(

ai giúp mình với :D


So sánh sự giống nhau giữa hai xâu cũng đơn giản thôi, không cần hiểu phức tạp hoá làm gì.
Bạn hãy tham khảo đoạn code dưới đây:
  1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  2.         MsgBox(giongnhau("Nguyễn Hà Xuân Hà", "Nguyễn Hà Anh Hà"))
  3. End Sub
  4. Private Function giongnhau(ByVal xau1$, ByVal xau2$) As String
  5.         Dim x1() As String = xau1.Split(" ")
  6.         Dim x2() As String = xau2.Split(" ")
  7.         Dim x$ = ""
  8.         Dim i% = -1
  9.         Dim j As Integer
  10.         Do : i = i + 1
  11.             For j = 0 To UBound(x1)
  12.                 If x2(i) = x1(j) Then
  13.                     x = x & x2(i) & " "
  14.                     x1(j) = ""
  15.                 End If
  16.             Next
  17.         Loop Until i = UBound(x2)
  18.         Dim t() As String = x.Trim.Split(" ")
  19.         giongnhau = "Các từ của xâu 1 (" & xau1 & ") có trong xâu 2 (" & xau2 & ") là '" & x.Trim() & Chr(10) &"Như vậy xâu 1 giống xâu 2 là " & ((UBound(t) + 1) / (UBound(x2) + 1)) * 100 & "%."
  20.     End Function
  21.  
Attachments
Ketqua.PNG
Ketqua.PNG (10.77 KiB) Viewed 4763 times
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599

User avatar
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 491
Joined: Wed 05/02/2014 3:43 pm
Location: Đồng Tháp,Việt Nam
Has thanked: 20 times
Been thanked: 8 times
Contact:

Re: So sánh chuỗi trong VB

Postby NTN » Fri 15/09/2017 12:27 pm

Chú ơi em có text1 là "asd fsadf asdasdwd" và text2 là "c" thì nó so sánh ra 100% là sao chú???
Em ví dụ thêm msgbox(giongnhau("con","gà")) nó hoàn toàn không giống nhau sau vẫn trả kết quả là 100% ạ?
Contact me: trungnhan0911@yandex.com
Github: https://github.com/nhannt201


Return to “Visual Basic .NET và C# (VB.NET & C#)”

Who is online

Users browsing this forum: No registered users and 9 guests