Жолдағы таңбалар жиынтығын тексеріңіз

Жолды ескере отырып, кейіпкерлер бірдей тәртіпте болуы керек, бірақ дәйекті емес болуы керек, сол жолдың ішінде таңбалардың жиынтығы барын (және орналасқан жерін) қалай тексеруге болады?

мысалы, «INEEDTOGETAHAIRCUT» жолы және {'O', 'E', 'G', 'T'

Рахмет

(Пс - мен күшті күш қолданып көрдім, бірақ бұл қорқынышты және жұмыс істемейді!)

4
міне, таңбалаушы кез келген жерде жолға шықпайды, дәйекті болуы керек, бірақ тапсырыс беру маңызды емес - бұл неге түсініксіз болып көрінуі мүмкін екенін көре аламын. Мен басқа түсіндіруге сенімдімін
қосылды автор Biscuit128, көзі
OOOO рұқсат етілмеген және иә төрт қатарлы шабандоздар, олар OEGT жиынтығын қанағаттандырады
қосылды автор Biscuit128, көзі
«OOOO» мәні сізге O E G және T комбинациясын іздей ме немесе сіз іздейсіз бе?
қосылды автор Fischermaen, көзі
Сұрақ анық емес. «Бір-бірімен ұштасқанда, кез-келген тәртіпте болуы мүмкін». Бұл өз-өзіне қарама-қайшы болып көрінеді.
қосылды автор David Heffernan, көзі
Сондықтан {'O', 'E', 'G', 'T'} жиынтығын пайдаланатын сынақ жолында қатарынан төрт таңбаны табуға болады
қосылды автор David Heffernan, көзі
@Akron Hmm. Жаңа сұрақ жоғарыда Риккидің түсініктемесі.
қосылды автор David Heffernan, көзі
Мәселені кім редакциялағанына сенімдімін, оның логикасын өзгертті. Мен бұл түсініксіз деп ойлаймын.
қосылды автор Akron, көзі

5 жауаптар

Егер сіз «бір-біріңе еріп жүрген кейіпкерлермен» не айтқыңыз келетінін 100% сенімді емес болсам, онда мына ықтимал тәсіл бар: таңбалар тізбегінің барлық ықтимал перестанцияларын жасаңыз және ауыстыруды іздеңіз

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
қосылды
Міне, менің жалғыз мәселе - күрделілік тәртібі. Бірақ бұл әскери қызметкер үшін маңызды емес.
қосылды автор Akron, көзі

System.Linq көмегімен, сіз мұны істей аласыз:

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

Немесе аргументация ретінде алқынды жиынды қабылдау үшін жаңа кеңейтім әдісін жазыңыз.  Кез келген тәртіпте таңбалардың кез-келген «тізбегі» болу үшін сіз мұны істей аласыз:

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;
    }
}

Сонда оны келесідей атаңыз:

"INEEDTOGETAHAIRCUT".ContainsAnySequenceOf(new List {'O','E','G','T'});
1
қосылды
Жарайды ма. Мен сіздің сұрағыңызды қазір жақсы түсінемін және оны орындауға жауапты редакцияладым.
қосылды автор Andrea Colleoni, көзі
Бірақ бұл тамаша, бірақ, өкінішке орай, мен жай ғана шын немесе жалғаннан гөрі қажеті жоқ. Маған шын мәнінде бұл туралы айту керек еді: /
қосылды автор Biscuit128, көзі

Неліктен қажет екенін тексеру үшін неге екі жолға қарапайым қарапайым нәрсені қолдануға болмайды

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
қосылды

Міне, мәселені шешудегі өте қараңғылық ескі мектептің тәсілі. Кейбір кодтың тиімді болуы мүмкін екеніне сенімді болсам да, іздеу жиынының барлық ауыстыруларын (қабылданған жауапта көрсетілгендей) санауға тыйым салады. Бұл қымбатқа түседі.

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
қосылды

Егер сіздің сұрағыңызды дұрыс түсінетін болсам:

Бірінші таңбаны табу үшін String.IndexOfAny() пайдалануға болады жүйелі.

Содан кейін олардың әрқайсысы құқықтық таңбалар жиынтығына кіретінін тексеру үшін жолдағы келесі таңбаларды қайталаңыз. Тізіміңізден тапқан әр таңбалар үшін (бірінші тапқаныңызды қоса алғанда) оны көшіріп алуға болатын заңды белгілер тізімінен алып тастаңыз.

Егер сіз заңсыз таңбаға ұрсаңыз, мәтін сәйкес келмейді, сондықтан жолдың қалған бөлігін өңдеу үшін осы алгоритмнің басына оралыңыз.

Егер сіз барлық заңды белгілерді қатардан тапсаңыз, онда сіздің нәтижеңіз болады.

0
қосылды
егер бұл мағынасы бар болса, олардың бәрі бірігіп пайда болатын алғашқы жағдайға қарама-қайшы келетін кез келген кейіпкердің бірінші кезектегі индексін қайтарады?
қосылды автор Biscuit128, көзі
Бірақ бұл «кейіпкерлер бір-бірімен ұштасқанда» қажеттілікті қанағаттандырмайды
қосылды автор Fischermaen, көзі
Кешіріңіз, сұрақ біраз түсініксіз болды. Жауапымды бірнеше мәрте анықтадым.
қосылды автор Jason Williams, көзі
Бұл менің Perl әдеттерім.
қосылды автор iehrlich, көзі