Nasıl bir anagram uygulama (php) için alt kümesidir kelimeler oluşturabilirim?

6 Cevap php

Ben bir alt kasalı alfabetik depolanan dize ile benim veritabanında bir anagram alanı oluşturarak, uygulama oluşturma bir anagram yarattı.

Örneğin, emme böylece kulak aer olur cinostu olur ve.

Ne şimdi yapmak istiyorum aranır orijinal evirmeceden itibaren alt kelimeler oluşturmaktır.

Örnek: Nasıl 'tutuklama', yani 'dinlenme' ve 'bir bakışla' için bir aramadan alt kümesi kelimeleri çekerek hakkında gitmek istiyorum.

6 Cevap

Bork hey. PHP kodunuzu uyarlamak için çalışıyor, ve ben şu var:

$ LetterCount = array ("a" => 1, "b" => 1, "c" => 1, "d" => 1, "e" => 0, "f" => 1, "g" => 1, "h" => 1, "i" => 1, "j" => 1, "k" => 1, "l" => 1, "m" => 1, "n" = > 1, "o" => 1, "p" => 1, "q" => 1, "r" => 1, "s" => 1, "t" => 1, "u" => 1, "v" => 1, "w" => 1, "x" => 1, "y" => 1, "z" => 1);

$AsciiCodeLowerCaseA = 97;

for ($j = 1; $j < strlen($string); $j++) {
  $CurrentLetter = $string[$j];
  $AsciiCode = ord($CurrentLetter);
  $AlphabetPos = $AsciiCode - $AsciiCodeLowerCaseA + 1;
      $LetterCount[$AlphabetPos] = $LetterCount[$AlphabetPos] + 1;
}

Ben zaman kazanmak için dizi beyan bit kodlanmış.

Her neyse, bu işe ve bana bu hatayı verdi görünmüyordu: Notice: Undefined offset: 1

İşte ben alıyorum hataların bir ekran görüntüsü, ben de size ne olup bittiğini anlamak, görmek için döngü içinde her var veya dizi için yankılanırken ekledik.

http://i42.tinypic.com/11ryz4g.png

I doğru dizide aplhabet harfi tespit edilmez ve dolayısıyla dizinin sonuna yanlış numaraları ekleme olduğunu düşünüyorum.

Bana ne yapmam gerektiğini ne düşündüğünüzü söyleyin.

İşte o alfabetik sıralama kriteri kelime listenizin yararlandığına önce kullanmış olduğunuz bir yaklaşımdır.

1)) aerrst (hedef kelime (tutuklama) alın ve sıralayın.

2) Sonra sıralanmış kelime, her harf ya dahil veya hariç olduğu yeni dizeleri oluşturmak. N harflerinin bir kelime için bu 2 ** N mümkün dizeleri verir. (PHP bilmiyorum ama eğer isterseniz, size yalancı ya da örneğin Python verebilir.)

For your target word we have: a, e, r, r, s, t, st, rs, rt, rst, rr, rs, rt, rst, rrs, rrt, rrst, er, er, es, et, est, ers, ert, erst, err, ers, ert, erst, errs, errt, errst, ae, ar, ar, as, at, ast, ars, art, arst, arr, ars, art, arst, arrs, arrt, arrst, aer, aer, aes, aet, aest, aers, aert, aerst, aerr, aers, aert, aerst, aerrs, aerrt, aerrst

3) Sonra sıralı listeye karşı bu dizeleri denetlemek. Lütfen kriteri listesinde görünür olanlar istediğiniz alt kümesi kelimeleri karşılık gelmektedir.

eg aerrst corresponds to full anagrams (arrest, rarest, raster, ...)
eg aerst will be in your sorted list (stare, tears, ...)
eg rrs will not be in your sorted list

Orijinal sözcüğün sonuna bir boşluk vardır. Alan harflerin ortasında biter Her yineleme, iki kelime alırsınız. Sonra bu iki kelimeyi test edebilirsiniz. Uzay yineleme desen başında veya sonunda ise, onu keserek ve o bir kelime test.

Ben (iş yapmak!) Üzgünüm, anlamlı henüz bu konuda düşünce değil, ama kelimeleri üreten sona Ancak, bu bir motherlover gibi önbelleğe olacağını unutmayın, bu yüzden bu yeniden-üreten gitmeyin birisi arar her zaman uçar.

CS.

Bu yaklaşım, sizinkinden biraz farklı, ama ben programlı uygulamak kolay olacağına inanıyorum. Ben optimum performans akıllıca olduğuna emin değilim, ama sana bırakacağım :-)

Öncelikle size uygun edebilmek için istediğiniz tüm yasal kelimelik bir sözlük gerekiyor.

Gerçek kelime saklamak ilk sütunda ile veritabanında bir "sözlük" veya "Sözcükler" tablosu oluşturun, kelime saklamak ikinci sütun kolay karşılaştırma için alt veya üst durumunda tüm dönüştürülür ve her harf için o zaman bir tamsayı sütun alfabe AZ.

Bu tabloya sözlük dosyasını içe ve programlı kez numaralı bu kelimenin görünen alfabenin her harfini saymak, ve bu mektubu için sütununda bu numarayı saklayın.

Örnek Kelime: bookkeeper

Kelime sütununda, sizin "b" 1, "p" ve "r" sütununa, sizin "o" 2 ve "k" sütun, ve "e" sütununda 3 kelime "muhasebeci" saklayın.

Eğer harf sayıları ile ithal tüm sözlük var sonra, oldukça kolay aşağıdaki yöntemi kullanarak belirli bir kelime tüm olası alt-kelimeleri belirleyebilirsiniz:

  • Lütfen dize harfleri saymak.
  • Tüm kelimeler verilen kelime bulunmayan harfleri kullanmak, ya da kelime mevcut olandan herhangi bir mektubun daha yok senin sözlük tablo oluşturmak döndüren bir SQL sorgusu oluşturun.

Sen alfabesini temsil eden 26 pozisyonları ile bir bellek dizi yaparak bunu başarabilir

Örnek kelime: vehicle

SELECT Word FROM Dictionary WHERE NOT (
  (a >= 1) OR (b >= 1) OR (c >= 2) ... OR (z >= 1)
)

Böylece bir 'a' ya da bir 'z' olan sizin sözlükte herhangi bir kelime sorgu 'a' ya da 'z' sayısı en az birinin herhangi bir kelime filtre olacağından, dışladı, ve herhangi bir kelime olduğunu edilir Birden fazla 'c', uygulandı üzerinden süzülür.

Kolayca 26 tamsayı dizisi, her 1'den başlayarak, ve sonra kelime geçmesi, bulmak her harfin uygun dizi değeri 1 ekleyerek kullanarak programlı bütün "VEYA" koşulları oluşturabilir.

GÜNCELLEME - son sayısı kod örneği

Aşağıda benim kod örneği bağışlayın - bu ASP (VBScript) olacak - ama kavramak ve çevirmek PHP, ya da bir tür kişi için bunu yapmak değilse olması gerekir.

Const AsciiCodeLowerCaseA = 97
InputWord = "Carrots"
LowerCaseInputWord = LCase(InputWord)

Dim LetterCount(26)

for i = 1 to 26
  LetterCount(i) = 1
next

for j = 1 to Len(InputWord)
  CurrentLetter = Mid(InputWord, j, 1)
  AsciiCode = Chr(CurrentLetter)
  AlphabetPos = AsciiCode - AsciiCodeLowerCaseA + 1
  LetterCount(AlphabetPos) = LetterCount(AlphabetPos) + 1
next

Sonra küçük harf için ASCII kodu 'a' çıkarılarak, ASCII değeri kelimenin her harfi dönüştürme ve 1 ekleyerek, 1-26 Alfabede bu mektubun konumunu almak. Şimdi o pozisyonda 1 eklenir dizi.

Bu counterintuitive görünüyor, ama dizideki 1'e tüm harfleri initialize. Eğer SQL ifadesi oluşturmak, size giriş kelime daha yüksek harfi sayımları ile bütün kelimeleri ortadan kaldırarak - böylece bir mektup orijinal kelime görünmüyorsa eğer, o harfin bir veya daha fazla olması sözcükleri filtrelemek. Harf kez görünüyorsa, bunu o mektubu iki veya daha fazla olması sözcükleri filtrelemek, ve.

Andy,

Eğer harflerle dizi endeksleme, henüz ASCII değerleri ile erişen - Ben bir karakter geri ASCII kodu dönüştürmek gerektiğini düşünüyorum.

İşte kod biraz değiştirilmiş bulunuyor:

$ LetterCount = array ("a" => 1, "b" => 1, "c" => 1, "d" => 1, "e" => 0, "f" => 1, "g" => 1, "h" => 1, "i" => 1, "j" => 1, "k" => 1, "l" => 1, "m" => 1, "n" = > 1, "o" => 1, "p" => 1, "q" => 1, "r" => 1, "s" => 1, "t" => 1, "u" => 1, "v" => 1, "w" => 1, "x" => 1, "y" => 1, "z" => 1);

$AsciiCodeLowerCaseA = 97;

for ($j = **0**; $j < strlen($string); $j++) {
  $CurrentLetter = $string[$j];
  $AsciiCode = ord($CurrentLetter);
  $AlphabetPos = **chr($AsciiCode - $AsciiCodeLowerCaseA + 1);**
  $LetterCount[$AlphabetPos] = $LetterCount[$AlphabetPos] + 1;
}

Ayrıca ben sadece 1'den dizesindeki karakterleri dizine fark ettim, ancak diziler sıfır idexed vardır.

(Ben bir şey eksik sürece) Ben bu kadar basit de olabilir düşünüyorum

for($j = 0; $j < strlen($string); $j++) {
$LetterCount[$string[$j]]++;
}