ابحث عن أطول كلمة من القاموس بناءً على الحروف المقدمة C#


مرحبا بالجميع، من فضلكم وأحتاج إلى مساعدتكم.
لدي ثلاثة مربعات نص في نموذج windows:
– يوجد في tetxBox1.Text قاموس يحتوي على العديد من الكلمات (أطول الكلمات
مكونة من 12 حرف)
– يوجد دائمًا 12 حرفًا معروضًا في textBox2.Text
– في textBox3.Text، أريد أن تكون النتيجة أطول كلمة من textBox1
تتألف من الرسائل المقدمة من textBox2

على سبيل المثال:

في textBox1.Text لدي الكلمات التالية:

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

في textBox2.Text لدي 12 حرفًا معروضة:

com.euclsfcysuls

في textBox3.Text أريد نتيجة أطول كلمة من textBox1.Text من الحروف من textBox2.Text:

بنجاح

أطلب مساعدتكم إذا كان ذلك ممكنا، بعض الحلول …
أتمنى أن تفهمني، وأعتذر عن لغتي الإنجليزية إذا لم تفهم.
شكرا لكم جميعا مقدما.

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

ما حاولت:

ج #
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));
        }

الحل 1

فكر في المهمة بدلاً من الحل: تحتاج إلى العثور على أطول مجموعة من الكلمات المطابقة التي تحتوي على أحرف مشتركة. لذا ابدأ بفعل شيئين: أنشئ خريطة للأحرف (هناك 26 احتمالًا فقط من “A” إلى “Z” شاملة) وقم بعدها لكل من “أحرف الاختيار” وكلماتك الفردية.
لذا فإن مثالك “euclsfcysuls” يعين ما يلي:

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

هذا أمر تافه: تمريرة واحدة من خلال كلمة تعد الحروف. اكتب طريقة للقيام بذلك واختبرها بدقة.

الآن أصبحت المشكلة أسهل: بالنسبة لكل كلمة يتم التحقق منها، ابحث عن عدد التطابقات من خلال مقارنة عدد الأحرف: إذا كانت “الكلمة المحتملة” تحتوي على عدد أحرف أكبر من نفس حرف “التحقق من الكلمة”، فهي ليست مطابقة.

أثناء المضي قدمًا، احتفظ بكلمة “الأطول حتى الآن”، وعندما تجد تطابقًا محتملاً، قارنها بالكلمة “الأطول حتى الآن” وقم بالتحديث حسب الحاجة.

في النهاية، لديك أطول تطابق ممكن.

الحل 2

سيكون اقتراحي هو تجميع كل الحروف الموجودة في السلسلة المستهدفة في مجموعة من الصف حيث يحتوي كل صف على حرف وعدد إجمالي تكرارات هذا الحرف. هناك طريقة linq يمكنها القيام بذلك.

ج #
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()));

كرر المجموعة وأضف كل مفتاح وعدد الحروف إلى القاموس. الآن، لكل سلسلة في مجموعة الاختبار، قم بتجميع الحروف بنفس الطريقة السابقة ولكن هذه المرة قم بالتكرار على مجموعات سلسلة الاختبار. لا يوجد تطابق إذا لم يكن الحرف الرئيسي موجودًا في القاموس الهدف أو كان هناك تكرار للحرف أكثر من الموجود في السلسلة الهدف. الكود ذو الصلة هو شيء على هذا المنوال.

ج #
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);
}

الآن جميع المباريات الناجحة موجودة في القائمة المطابقة. قم بفرز القائمة حسب طول السلاسل بترتيب تنازلي. الفائز هو الإدخال الأول في القائمة.

コメント

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