Verimli algoritma T9 OLMADAN, bir tuş takımı dizisi için olası kelimeleri saymak

oy
2

feragat : Bazı olmadığından benzer ancak eşit sorular, dikkat ile okuyunuz, sadece T9 ile tuş takımı için referanslar, ancak olmadan kimseyi bulabilirsiniz.

  • harflerle Telefon Tuş takımı Verilen

2 - a, b, c

3 - d, e, f

... ve bunun gibi

  • Örnek 222, sayı haneli bir dizi göz önüne alındığında,

Talep : yazılabilir kaç olası kelime bul T9 OLMADAN

Örnek:

222 olabilir:

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

Yani, 4 olası çözümler

2222 olabilir:

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)

Yani, 7 muhtemel çözümler

Koşullar:
- bir backtracking / kaba kuvvet yaklaşımı
- uzun sekanslar ile etkili olmalıdır (1000'den fazla rakam, çalıştırmak için en az 10 sn)
- tüm olası kelimeler geri dönmek için bir ihtiyaç vardır , ancak sadece sayımı

Lütfen dikkat: Ben nihai algoritma aramıyorum, ancak mümkün yaklaşım endikasyonları

Teşekkürler

Oluştur 18/12/2018 saat 11:08
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
2

Burada görüntü açıklama girin

Algoritma / Sezgi:

  • Yukarıdaki görüntüde temsil gibi, tek bir basamak için, 3-4 olasılık vardır.
  • Biz aynı rakamıyla 2 veya 3 veya 4 kez basarsanız, biz ekranda farklı karakterler olsun.
  • Gibi biz basarsanız 2
    • 1 kez - a
    • 2 kez - b
    • 3 kere - c
  • Yani, biz hesaplarken / olası alt dizeleri sayısını saymak, biz eklemeniz gerekir subproblem(i-2),subproblem(i-3),subproblem(i-4)o olur toplam sayım değerleri i = i-1 = i-2.
  • Örneğin, alalım 222 . Biz bir üst alt yaklaşım sergilemesini.
  • İlk 2 içinde 222 (yazarak olacaktır sadece 1 imkanı vardır a).
  • İkinci İçin 2 yılında 222 , ya bize verebilir aveya bu olabilir 2bize bir vererek 2 kez basılmış b. Yani, kombinasyonlar olabilir aave b.
  • Üçüncü için 2 içinde 222 , o olabilir aveya b(eğer ikinci başladı 2) ya da c.
  • Bu nedenle, herhangi bir. Her dizin için kombinasyonlarının ihiçbir toplamıdır. arasında eşleşmeler ikadar i-3ya i-4hiç bağlı olarak. karakter her basamaklı tuş takımı temsil eder.
  • İ eğer unutmayın inci karakter ile eşleşir i-1sonra ekleyin dp[i-2]ve dp[i-1]beri i-1 till itek bir karakteri temsil (birden çok kez basıldığında).

Kod:

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

Çıktı:

222 : 4
2233 : 4
23456789 : 1
54667877 : 8
5466 : 2
7777 : 8
22 : 2
7898989899 : 26
77779999 : 64
Cevap 18/12/2018 saat 12:31
kaynak kullanıcı

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