Jo'ldagi belgi majmuasini tekshiring

Agar mag'lubiyatga ega bo'lsak, simvollar bir xil tartibda bo'lishi kerak, ammo ketma-ketlikda bo'lmasligi kerak bo'lgan belgilar qatorida bir qator belgilar mavjudligini tekshirib olishingiz mumkin.

Masalan, "INEEDTOGETAHAIRCUT" qatori va "O", "E", "G", "T"

Rahmat

(PS - men qo'pol kuch ishlatishga harakat qildim, lekin u dahshatli va ishlamaydi!)

4
Yaxshiyamki, chiroyli simlar hech qanday joyga kela olmaydi, ketma-ket bo'lishi kerak, ammo buyurtma muhim emas - hmmm nima uchun bu noto'g'ri ko'rinishi mumkin. Qanday qilib boshqacha tushuntirishga amin emasman
qo'shib qo'ydi muallif Biscuit128, manba
OOOOga ruxsat berilmaydi va ha 4 ta ketma-ketlikdagi OEGTga mos keladigan xarakteristikalar
qo'shib qo'ydi muallif Biscuit128, manba
"OOOO" qiymatining qiymati O E G va T ning har qanday kombinatsiyasini izlamoqchi bo'lganmi yoki yo'qmi?
qo'shib qo'ydi muallif Fischermaen, manba
Savol aniq emas. "Agar bir-biriga ergashadigan bo'lsalar, ular biron bir tartibda bo'lishi mumkin". Bu o'z-o'zidan qarama-qarshilik kabi ko'rinadi.
qo'shib qo'ydi muallif David Heffernan, manba
Ya'ni, {"O", "E", "G", "T"} dan foydalangan holda sinov satrida ketma-ket to'rtta belgini topishingiz kerak.
qo'shib qo'ydi muallif David Heffernan, manba
@Akron Hmm. Yangi savol Rikki yuqoridagi sharhga mutlaqo boshqacha.
qo'shib qo'ydi muallif David Heffernan, manba
Savolni kim tartibga solgan bo'lsa, men uning mantig'ini o'zgartirganiga juda aminman. Men bu aniq emas deb o'ylayman ...
qo'shib qo'ydi muallif Akron, manba

5 javoblar

Agar "belgilar bir-birini ta'qib qilayotgan" bilan nimani nazarda tutganingizdan qat'i nazar 100 foiz ishonchim bo'lmasa, bu erda mumkin bo'lgan yondashuv: belgilar ketma-ketligining barcha mumkin bo'lgan almashinuvlarini yaratish va almashtirishni qidirib toping

using System;
using System.Collections.Generic;
class Program {

    static IEnumerable GetPermutations(string value) {
        if (value.Length == 1) {
            yield return value;
        } else {
            for (int i = 0; i < value.Length; ++i) {
                string a = value[i].ToString();
                foreach (string b in GetPermutations(value.Remove(i, 1))) {
                    yield return a + b;
                }
            }
        }
    }

    static void Main(string[] args) {

        string test = "INEEDTOGETAHAIRCUT";
        string chars = "OEGT";
        foreach (string to_find in GetPermutations(chars)) {
            int i = test.IndexOf(to_find);
            if (i != -1) {
                Console.WriteLine("Found {0} at index {1}", to_find, i);
            }
        }
    }
}
1
qo'shib qo'ydi
Xo'sh, bu mening yagona muammo murakkablik tartibidir. Lekin, ehtimol, bu askar uchun ahamiyatga ega emas.
qo'shib qo'ydi muallif Akron, manba

Sistemangizda System.Linq bilan buni amalga oshirishingiz mumkin:

"INEEDTOGETAHAIRCUT".ToCharArray().Any(c => c=='O' || c=='E' || c=='G' || c=='T');

Yoki argument sifatida char majmuini qabul qilish uchun yangi kengaytma usuli yozing.  Har qanday tartibda biron-bir "ketma-ketlikni" ketma-ketlikda bo'lish uchun quyidagilarni amalga oshirishingiz mumkin:

public static class MyExtensions
{

    public static bool ContainsAnySequenceOf(this String str, List charArray)
    {
        foreach (char c in charArray)
        {
            if (str.ToCharArray().Any(x => x == c))
            {
                charArray.Remove(c);
                return str.Substring(str.IndexOf(c), Math.Min(str.Length - str.IndexOf(c), charArray.Count)).ContainsAnySequenceOf(charArray);
            }
        }
        return false;
    }
}

Unday bo'lsa, shunday deb chaqiring:

"INEEDTOGETAHAIRCUT".ContainsAnySequenceOf(new List {'O','E','G','T'});
1
qo'shib qo'ydi
Ok. Men sizning savolingizni yaxshiroq tushunib oldim va buni amalga oshirish uchun javobimni tahrir qildim.
qo'shib qo'ydi muallif Andrea Colleoni, manba
ahhh bu mukammal, lekin afsuski, men faqat haqiqiy yoki noto'g'ri emas, balki qaerda bo'lishim kerak. Men, albatta, shuni eslatib o'tdim:
qo'shib qo'ydi muallif Biscuit128, manba

Nega kerakli narsani tekshirish uchun nima qilish kerakligini faqat ikkita qatordan yanada oddiyroq qilish kerak

string strCompare = "INEEDTOGETAHAIRCUT";
string strStringContains = ""AHRI"; 
var matchingString = strCompare.IndexOfAny(strStringContains.ToCharArray()) != -1;
then wrap the matchingString in an if(matchingString){ }//should return true or false
1
qo'shib qo'ydi

Bu muammoni hal qilish uchun juda ilg'or eski maktabning yondashuvi. Aminmanki, ba'zi kodlarning samarasi yanada samarali bo'lishi mumkin, natijada qidirish to'plamining barcha parametrlarini numaralandırmaktan kaçınır (qabul qilingan javobda bo'lgani kabi). Buning qimmat bo'lishi mumkin edi.

static bool matchesPermutation(string test, string search)
{
    string remaining = search;
    for (int i = 0; i < test.Length; i++)
    {
        int pos = remaining.IndexOf(test[i]);
        if (pos == -1)
            return false;
        else
            remaining = remaining.Remove(pos, 1);
    }
    return true;
}

static int findPermutation(string test, string search)
{
    for (int i = 0; i < test.Length-search.Length+1; i++)
        if (matchesPermutation(test.Substring(i, search.Length), search))
            return i;
    return -1;
}

static void Main(string[] args)
{
    string test = "INEEDTOGETAHAIRCUT";
    string search = "AHRI";
    int foundPos = findPermutation(test, search);
    Console.WriteLine(foundPos);
    if (foundPos != -1)
        Console.WriteLine(test.Substring(foundPos, search.Length));
}
0
qo'shib qo'ydi

Agar savolingizni to'g'ri tushunsam:

Birinchi belgini topish uchun String.IndexOfAny() dan foydalanishingiz mumkin. ketma-ketlik.

So'ngra, ularning har biri huquqiy belgilar to'plamiga kiritilganligini tekshirish uchun simvoldagi quyidagi belgilar ustidan yineleyin. Ro'yxatingizda topilgan har bir belgi (birinchi topilganingizdan tashqari) uni takrorlashlari mumkin bo'lgan huquqiy belgilar ro'yxatidan olib tashlang.

Noqonuniy belgiga siltagan bo'lsangiz, matn materiya emas, shuning uchun mag'lubiyatning qolgan qismini qayta ishlash uchun ushbu algoritmning boshiga qayting.

Agar siz barcha qonuniy belgilarni ketma-ket topsangiz, sizning natijangiz bo'ladi.

0
qo'shib qo'ydi
agar bu mantiqqa to'g'ri keladigan bo'lsa, ular birgalikda paydo bo'ladigan birinchi holatlarga qarshi chiqqanlarimdan farq qiladigan biron bir belgining birinchi paydo bo'lish ko'rsatkichini qaytaradi?
qo'shib qo'ydi muallif Biscuit128, manba
Biroq, bu "bir-birini ta'qib qilgan belgilar kabi"
qo'shib qo'ydi muallif Fischermaen, manba
Kechirasiz, savol biroz aniq emas edi. Mening javobim biroz ko'proq yordam bilan yangilandi.
qo'shib qo'ydi muallif Jason Williams, manba
Ular mening Perl odatlarim.
qo'shib qo'ydi muallif iehrlich, manba