Как сравнить два массива символов, сравнивающих символы в одной и той же хронологии, но с дополнительным знаком, который обозначает каждый возможный знак? - PullRequest
0 голосов
/ 18 ноября 2018
char [] text = {'H','e','l','L','o','H','e','l','L','o'};
char[] pat = {'H','e','?','l','o'}; //'?' stands for every possible sign

Мы можем игнорировать, являются ли буквы прописными или строчными. Теперь мне нужно вывести, как часто это происходит.

Output:  He?lo is in HelLoHelLo 2x

Я знаю, что вы можете использовать строковые методы типа "содержать", но как я могу рассмотреть вопросительный знак?

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018
public int matchCount(char[] text, char[] pattern) {
    int consecCharHits = 0, matchCount = 0;

    for (int i = 0; i < text.length; i++) {
        if (text[i] == pattern[consecCharHits] || '?' == pattern[consecCharHits]) { // if char matches
            consecCharHits++;
            if (consecCharHits == pattern.length) { // if the whole pattern matches
                matchCount++;
                i -= consecCharHits - 1; // return to the next position to be evaluated
                consecCharHits = 0; // reset consecutive char hits
            }
        } else {
            i -= consecCharHits;
            consecCharHits = 0;
        }
    }
    return matchCount;
}
0 голосов
/ 18 ноября 2018
@Test
public void match() {
    char [] text = {'H','e','l','L','o','H','e','l','L','o'};
    char[] pat = {'H','e','?','l','o'}; //'?' stands for every possible sign
    printMatch(text, pat);
}

private void printMatch(char[] text, char[] pat) {
    String textStr = new String(text);
    String patStr = new String(pat);
    final String regexPattern = patStr.replace('?', '.').toLowerCase();
    final Pattern pattern = Pattern.compile(regexPattern);
    final Matcher matcher = pattern.matcher(textStr.toLowerCase());
    while (matcher.find()) {
        System.out.println(patStr + " is in " + textStr );
    }
}
0 голосов
/ 18 ноября 2018

Как насчет этого?

static int countPatternOccurences (char [] text, char [] pat)
{
    int i = 0;
    int j = 0;
    int k = 0;
            while ( i < text.length)
            {
                int a = Character.getNumericValue(pat[j]);
                int b = Character.getNumericValue(text[i]);


                if (a == b || pat[j] =='?')
                {
                    j++;

                }
                else
                {
                    j=0;
                    //return 0;
                }
                if(j == pat.length)
                {
                    k++;
                    j = 0;
                }
                i++;
            }
            return k; // returns occurrences of pat in text
        }
0 голосов
/ 18 ноября 2018

То, как я наивно реализовывал бы это, не слишком задумываясь об этом

  • создать inputIndex и установить 0
  • создать matchIndex и установить 0
  • перебирает ввод, увеличивая inputIndex один за другим
    • сравните символ на входе в inputIndex с символом в совпадении в matchIndex
    • , если они "совпадают", увеличивают matchIndex на единицу - если они не устанавливают matchIndex в 0
    • , если matchIndex равно вашей длине pat, увеличьте фактическое количество совпадений на единицу и установите matchIndex обратно на 0

Там, где я написал "match", вам нужно реализовать вашу собственную логику сопоставления, игнорируя регистр и считая все совпадения, если шаблон в этом месте равен ?.

...