[英]Java Word Search Solver Design Approach
我正在編寫一個程序,它是一個單詞搜索解決方案,並且好奇是否有比我正在采用的方法更好的方法。 該程序包含一個字符網格,這些字符被認為是難題,然后是換行符和位於矩陣中的單詞。
我的問題是,在查找每個字符串的開始和結束字符時,最好是使用每個方向的嵌套循環將其牢固地穿過拼圖,還是可以使用某種直線檢測算法來簡化此過程?
單詞可以是水平,垂直或對角線,也可以相反。
我真正想做的是在2d char數組(Puzzle)內繪制char數組(Word)的起點和終點。
拼圖的例子
HGAMONIHRA
AOMOKAWONS
NFROLBOBDN
ARFSIHCAGE
LNIEEWONOK
GOLFUNDTHC
KOCATAOHBI
AMRERCGANH
SLGFAMALLC
ALLIGATORX
馬
牛
RHINO
JABBERWOCKY
貓
狗
鱷魚
雞
青蛙
班薩
駝鹿
駱駝
假設我只使用了一系列循環,我不確定在所有方向進行檢查的最佳方法。 到目前為止,我只是在水平搜索單詞
boolean over = false;
boolean foundit = false;
String word = new String(letters);
for (int i = 0; (i < puzzle.length) && (!over); i++) {
for (int j = 0; (j < puzzle[i].length) && (!over); j++) {
// Use (i,j) as the starting point.
foundit = true;
// Look through each letter in word
for (int k = 0; (k < letters.length) && (foundit); k++) {
if ((j + k >= puzzle[i].length)
|| (letters[k] != puzzle[i][j + k])) {
// It didn't Match
foundit = false;
}
}
// Success if we made it through all the characters
if (foundit) {
System.out.println(word + " found in row=" + i
+ " col=" + j);
over = true;
}
}
}
if (!foundit) {
System.out.println(word + " not found");
}
在垂直,對角線和反向找到它們的任何指針?
蠻力行將不會是可怕的。 您可以使用更快的算法,但是初始開銷可能會超過收益,因此請確保以一個典型示例為基准。
您可以嘗試將整個拼圖放入multi_hashmap中,其中字母是鍵,位置是值。 這樣可以使搜索速度更快(用O(1)進行查找,而不是用O(n)來查找第一個字母),但是您可能得不到任何好處,因為您必須遍歷整個難題才能將其放入哈希圖中。
蠻力非常接近O(n * m),其中n是拼圖大小,m是隱藏單詞的數量。 (我假設單詞長度受限制,例如20。)
使用哈希圖並不能帶來太多收益。 它大約是O(n + m),但是對於較小的拼圖來說,時間差不大。 但是,漸近絕對更好。 兩者都做,比較他們的時間。 那是最好的認識方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.