Tìm từ dài nhất trong từ điển dựa trên các chữ cái được cung cấp C#

lập trình


Xin chào tất cả mọi người, xin vui lòng và cần sự giúp đỡ của bạn.
Tôi có ba hộp văn bản trên biểu mẫu cửa sổ:
– Trong tetxBox1.Text có một từ điển có nhiều từ (từ dài nhất
có 12 chữ cái)
– Luôn có 12 chữ cái được cung cấp trong textBox2.Text
– Trong textBox3.Text, tôi muốn kết quả là từ dài nhất so với textBox1
bao gồm các chữ cái được cung cấp từ textBox2

Ví dụ:

Trong textBox1.Text tôi có các từ sau:

characters
character
charity
act
acter
acted
successfully
wind
succession
windy
successful
window
windows
success
excellent
excel
excellence
excellency

Trong textBox2.Text tôi có 12 chữ cái sau được cung cấp:

euclsfcysuls

Trong textBox3.Text tôi muốn kết quả là từ dài nhất từ ​​textBox1.Text hơn các chữ cái từ textBox2.Text:

thành công

Tôi đang nhờ sự giúp đỡ của bạn nếu có thể, một số giải pháp…
Tôi hy vọng bạn hiểu tôi, tôi xin lỗi vì tiếng Anh của tôi nếu bạn không hiểu.
Trước tiên xin cảm ơn tất cả các bạn.

https://i.postimg.cc/HnS59c2R/Capture.png[^]

Những gì tôi đã thử:

C#
static bool isSubSequence(String str1,
                                String str2)
        {
            int m = str1.Length, n = str2.Length;

            int j = 0; 

            for (int i = 0; i < n && j < m; i++)
            {
                if (str1[j] == str2[i])
                {
                    j++;
                }
            }
            return (j == m);
        }


static String findLongestString(List<String> dict,
                                            String str)
        {
            String result = "";
            int length = 0;
            foreach (String word in dict)
            {
                if (length < word.Length &&
                    isSubSequence(word, str))
                {
                    result = word;
                    length = word.Length;
                }
            }

            return result;
        }

private void btnfind_Click(object sender, EventArgs e)
        {
            String[] arr = textBox1.Lines;
            List<String> dict = new List<String>(arr);
            String str = textBox2.Text;
            textBox3.Text = (findLongestString(dict, str));
        }

Giải pháp 1

Hãy suy nghĩ về nhiệm vụ thay vì giải pháp: bạn cần tìm bộ từ phù hợp dài nhất có các chữ cái chung. Vì vậy, hãy bắt đầu bằng cách thực hiện hai việc: xây dựng bản đồ các ký tự (chỉ có 26 khả năng bao gồm từ ‘A’ đến ‘Z’) và đếm chúng cho cả “các chữ cái kiểm tra” và các từ riêng lẻ của bạn.
Vì vậy, ví dụ “euclsfcysuls” của bạn ánh xạ tới:

A 0
B 0
C 2
D 0
E 1
F 1
G 0
H 0
I 0
J 0
K 0
L 2
M 0
N 0
O 0
P 0
Q 0
R 0
S 3
T 0
U 2
V 0
W 0
X 0
Y 1
Z 0

Điều đó thật tầm thường: một lần vượt qua một từ để đếm các chữ cái. Viết một phương pháp để làm điều đó và kiểm tra nó kỹ lưỡng.

Giờ đây, vấn đề trở nên dễ dàng hơn: đối với mỗi từ cần kiểm tra, hãy tìm xem có bao nhiêu từ khớp bằng cách so sánh số lượng chữ cái: nếu “từ có thể” có số lượng chữ cái lớn hơn cùng một chữ cái trong “từ kiểm tra” thì đó không phải là một từ khớp.

Khi bạn xem qua, hãy giữ từ “dài nhất cho đến nay” và khi bạn tìm thấy một kết quả phù hợp, hãy so sánh từ đó với từ “dài nhất cho đến nay” và cập nhật nếu cần.

Cuối cùng, bạn có trận đấu dài nhất có thể.

Giải pháp 2

Đề xuất của tôi là nhóm tất cả các chữ cái trong chuỗi mục tiêu thành một tập hợp các bộ dữ liệu trong đó mỗi bộ chứa cả một chữ cái và tổng số lần xuất hiện của chữ cái đó. Có một phương pháp linq có thể thực hiện việc này.

C#
string target = "euclsfcysuls";
//group all the letters into a collection of tuples char key and key count
IEnumerable<(char Key, int count)> resultCollection = target.GroupBy(c => c).Select(g => (g.Key, g.Count()));

Lặp lại bộ sưu tập và thêm từng khóa và số chữ cái vào từ điển. Bây giờ, đối với mỗi chuỗi trong bộ sưu tập thử nghiệm, hãy nhóm các chữ cái theo cách tương tự như trước nhưng lần này lặp lại các nhóm chuỗi thử nghiệm. Không có kết quả trùng khớp nếu chữ cái chính không có trong từ điển đích hoặc có nhiều lần lặp lại một chữ cái hơn trong chuỗi đích. Mã có liên quan là một cái gì đó dọc theo những dòng này.

C#
bool isSuccessful = true;
foreach (var (key, count) in testCollection)
{
    //there is no match if the key char is not present in the target dict or
    //there are more repetitions of a letter  than in the target string
    if (targetDict.ContainsKey(key) is false || targetDict[key] < count)
    {
        isSuccessful = false;
        break;
    }
}
if (isSuccessful)
{
    matchedList.Add(testString);
}

Bây giờ tất cả các trận đấu thành công đều nằm trong danh sách trận đấu. Sắp xếp danh sách theo độ dài của chuỗi theo thứ tự giảm dần. Người chiến thắng là người đầu tiên trong danh sách.

コメント

タイトルとURLをコピーしました