Chuẩn hoá 1 chuỗi đầu vào theo nguyên tắc
Chuẩn hoá 1 chuỗi đầu vào theo nguyên tắc: Không tồn tại 2 ký tự liền kề giống nhau, các ký tự không liền kề vẫn có thể giống nhau. Ví dụ với chuỗi đầu vào là "AABBBBCCCCDDAAAAAA" thì chuỗi sau khi chuẩn hoá là "ABCDA"
Xin đóng góp một câu trả lời với 2 vòng lặp theo cách tiếp cận vừa xử lý nén vừa duyệt qua chuỗi
Private Function Normalize(Optional InputString As String = "") As String
' Normalize all
'AABBBBCCCCDDAAAAAA
Dim xStr As String, Tmp As String, i As Long
' Get first occurent
If InputString = "" Then
xStr = "AABBBBCCCCDDAAAAAA"
Else
xStr = InputString
End If
While i < Len(xStr)
Tmp = Mid(xStr, i + 1, 1)
While InStr(xStr, Tmp & Tmp) > 0
xStr = Replace(xStr, Tmp & Tmp, Tmp)
Wend
i = i + 1
Debug.Print xStr
Wend
Normalize = xStr
End Function
Cách tiếp theo có thể dùng đệ quy hoặc duyệt qua chuỗi. Nhìn chung bài này có nhiều cách giải quyết.
Cách giải trên đây vẫn chưa phải là tối ưu do vẫn có một số vòng lặp bị thửa (giả định như chuỗi không còn phần tử lặp thì nó vẫn cứ phải duyệt qua cả chuỗi).
Tôi cũng góp vui bằng cách sử dụng hàm Trim()
Function ConverStr(Str As String) As String
Dim C As String
Str = Application.WorksheetFunction.Trim(vbBack & Str & vbBack)
Str = Replace(Str, " ", vbBack)
i = 2
Do Until i = Len(Str)
C = Mid(Str, i, 1)
If C <> vbBack Then Str = Replace(Application.WorksheetFunction.Trim(Replace(Str, C, " ")), " ", C)
i = i + 1
Loop
ConverStr = Replace(Mid(Str, 2, Len(Str) – 2), vbBack, " ")
End Function
Nếu không phân biệt chữ hoa, chữ thường thì thêm một dòng lệnh Convert cả chuỗi sang chữ hoa hoặc chữ thường.
Bạn cho hỏi: Có phân biệt HOA – thường không? Hay người dùng tự định nghĩa lấy?
Giống nhau theo tôi là có phân biệt, tuy nhiên có thể làm theo cả 2 cách, nếu không phân biệt có lẽ sẽ phức tạp hơn chút xíu.
Nếu không phân biệt chữ hoa, chữ thường thì thêm một dòng lệnh Convert cả chuỗi sang chữ hoa hoặc chữ thường.
Không phân biệt chữ hoa chữ thường nhưng kết quả trả về vẫn có chữ hoa và chữ thường tùy thuộc vào ký tự đầu tiên bị trùng lặp mà ta xét, ví dụ "aAABbbCCCdDdAa" thì kết quả là "aBCdA". Với yêu cầu đó thì có lẽ không dùng phương pháp này được.
Cứ For Next bình thường là được rồi
– Đặt 1 biến tạm
– Quét chuổi từ 1 đến Len(Chuổi)
– Nếu biến tạm <> ký tư thứ i thi
a> Lấy ký tự thứ i này ráp vào 1 chuổi tạm khác
b) Cho biến tạm = Ký tự thứ i– Tiếp tục vòng lập
– Cuối cùng lấy kết quả chính là chuổi tạm khác
———-
Phân biệt HOA thường hay không, cùng lắm chỉ xét thêm UCase nữa là xong!
Các bạn làm trước theo hướng dễ: Có phân biệt HOA – thường rồi sau đó hẳn tính tiếp
www.giaiphapexcel.com/diendan/threads/b%C3%A0i-t%E1%BA%ADp-v%E1%BB%81-v%C3%B2ng-l%E1%BA%B7p.39326/post-261194
Khoá học Trưởng phòng nhân sự
Nguồn nhân lực là một trong Tứ trụ kinh doanh của doanh nghiệp, có tác động tới sự tồn tại và phát triển bền...
Xem khóa học