Эффективный алгоритм для подсчета возможных слов для последовательности клавиатуры, БЕЗ Т9

голоса
2

отказ от ответственности : так как есть некоторые похожие , но не одинаковые вопросы, пожалуйста , прочитайте внимательно, я могу найти только ссылки на клавиатуру с Т9, но никто без.

  • Учитывая Клавиатура телефона с буквами

2 - а, б, в

3 - д, д, е

... и так далее

  • Учитывая последовательность цифр чисел, например, 222

Запрос : Найти сколько возможных слов можно записать без Т9

Пример:

222 может быть:

array (size=4)
  0 => string 'C' (length=1)
  1 => string 'AB' (length=2)
  2 => string 'BA' (length=2)
  3 => string 'AAA' (length=3)

Так, 4 возможных решений

2222 может быть:

array (size=7)
  0 => string 'AC' (length=2)
  1 => string 'BB' (length=2)
  2 => string 'CA' (length=2)
  3 => string 'AAB' (length=3)
  4 => string 'ABA' (length=3)
  5 => string 'BAA' (length=3)
  6 => string 'AAAA' (length=4)

Так, 7 возможных решений

Требования:
- не возвраты / брутфорс подход
- должно быть эффективными с длинными последовательностями (более 1000 цифр, менее 10 сек для выполнения)
- нет необходимости возвращать все возможные слова , но только их количество

Пожалуйста, обратите внимание: я не ищу для окончательного алгоритма, но указания на возможный подход

Спасибо

Задан 18/12/2018 в 11:08
источник пользователем
На других языках...                            


1 ответов

голоса
2

введите описание изображения здесь

Алгоритм / Интуиция:

  • Как он представляет на изображении выше, для одной цифры, есть 3-4 возможностей.
  • Если нажать одну и ту же цифру 2 или 3 или 4 раза, мы получаем различные символы на дисплее.
  • Мол, если мы нажмем 2
    • 1 раз - a
    • 2 раза - b
    • три раза - c
  • Таким образом, при вычислении / подсчитать количество возможных подстрок, нам нужно добавить subproblem(i-2),subproblem(i-3),subproblem(i-4)значение к нашему общему количеству , если это произойдет , что i = i-1 = i-2.
  • Например, давайте возьмем 222 . Мы будем принимать сверху вниз подход.
  • Во- первых 2 в 222 имеет только 1 возможность (который будет печатающей a).
  • Для второго 2 в 222 , он может дать нам либо aили это может быть , что 2было нажат 2 раза дает нам b. Таким образом, комбинации могут быть aaи b.
  • Для третьего 2 в 222 , он может быть aили b(если начался со второго 2) или c.
  • Следовательно, нет. комбинаций для каждого индекса iявляется сумма нет. из матчей с iдо i-3или i-4, не в зависимости от того нет. символов каждая цифра представляет на клавиатуре.
  • Обратите внимание , что если я й символ совпадает с i-1, то мы добавим dp[i-2]и не dp[i-1]так i-1 till iпредставляют один символ (при нажатии несколько раз).

Код:

import static java.lang.System.out;
public class Solution{    
    public static int possibleStringCount(String s){
        int len = s.length();
        int[] dp = new int[len];
        dp[0] = 1;// possibility is 1 for a single character
        for(int i=1;i<len;++i){
            int possible_chars_length = numberOfRepresentedCharacters(s.charAt(i)-'0') - 1;// because current character itself counts as 1. 
            dp[i] = 0;
            for(int j=i;j>=0;j--){
                if(i - possible_chars_length > j) break;
                if(s.charAt(i) == s.charAt(j)){
                    if(j-1 > -1){
                        dp[i] += dp[j-1];
                    }else{
                        dp[i] += 1;// if there are no combinations before it, then it represents a single character
                    }
                }
            }
        }

        return dp[len-1];
    }

    private static int numberOfRepresentedCharacters(int digit){
       if(digit == 7 || digit == 9) return 4;
        return 3;// it is assumed that digits are between 2-9 always
    }

    public static void main(String[] args) {
        String[] tests = {
            "222","2233","23456789","54667877","5466","7777","22","7898989899","77779999"
        };

        for(String testcase : tests){
            out.println(testcase + " : " + possibleStringCount(testcase));
        }
    }
}

Выход:

222 : 4
2233 : 4
23456789 : 1
54667877 : 8
5466 : 2
7777 : 8
22 : 2
7898989899 : 26
77779999 : 64
Ответил 18/12/2018 в 12:31
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more