鑑於以下代碼,您可以獲得一個單詞的所有字符排列。如果你填充了isValidWord(),你可以將其設置爲字典中的單詞(allWords.txt?)。該方法從可用字符構建排列,因此不需要檢查排列是否是一個字謎。
public boolean isValidWord(String word) {
return true; // return you dictionary check here
}
public Set<String> getAnagramsFor(String word, String letters) {
Set<String> set = new HashSet<>(); // no duplicates because of a letter occuring more than once
if (letters.isEmpty()) {
if (isValidWord(word)) {
set.add(word);
}
} else {
for (int i = 0; i < letters.length(); i++) {
String restOfLetters = letters.substring(0, i) + letters.substring(i + 1);
set.addAll(getAnagramsFor(word + letters.charAt(i), restOfLetters));
}
}
return set;
}
public void run() {
System.out.println(getAnagramsFor("", "tea"));
System.out.println(getAnagramsFor("", "foo"));
}
這些測試要求
System.out.println(getAnagramsFor("", "tea"));
System.out.println(getAnagramsFor("", "foo"));
打印
[tea, aet, eta, ate, tae, eat]
[foo, oof, ofo]
希望這有助於。
編輯:作爲第二個解決方案,並且關於您的受限詞典,您可以瀏覽您的詞典並檢查每個單詞是否是您的單詞的一個字母。在這段代碼是這兩種解決方案,BTW這裏的原詞是結果集的部分不再:
private List<String> wordsToFind = Arrays.asList(new String[] { "evil", "streets", "uprising" });
private List<String> validWords = Arrays.asList(new String[] { "andes", "danes", "deans", "evil", "gals",
"lags", "levi", "live", "sedan", "slag", "streets", "testers", "uprising", "veil", "vile" });
public boolean isValidWord(String word) {
return validWords.contains(word);
}
public Set<String> getAnagramsFor(String word, String letters) {
Set<String> set = new HashSet<>(); // no duplicates because of a letter occuring more than once
if (letters.isEmpty()) {
if (isValidWord(word)) {
set.add(word);
}
} else {
for (int i = 0; i < letters.length(); i++) {
String restOfLetters = letters.substring(0, i) + letters.substring(i + 1);
set.addAll(getAnagramsFor(word + letters.charAt(i), restOfLetters));
}
}
return set;
}
public Set<String> getAnagramsFor1(String word) {
Set<String> anagrams = getAnagramsFor("", word);
anagrams.remove(word); // remove original word from the result set
return anagrams;
}
public boolean isAnagram(String str1, String str2) {
char word1[] = str1.toLowerCase().replaceAll("\\W", "").toCharArray();
char word2[] = str2.toLowerCase().replaceAll("\\W", "").toCharArray();
Arrays.sort(word1);
Arrays.sort(word2);
return (Arrays.equals(word1, word2));
}
public Set<String> getAnagramsFor2(String word) {
Set<String> anagrams = new HashSet<>();
for (String potentialAnagram : validWords) {
if (!word.equals(potentialAnagram) && isAnagram(potentialAnagram, word)) {
anagrams.add(potentialAnagram);
}
}
return anagrams;
}
這個測試代碼
for (String wordToFind : wordsToFind) {
System.out.println(wordToFind + ": " + getAnagramsFor1(wordToFind));
System.out.println(wordToFind + ": " + getAnagramsFor2(wordToFind));
}
帶來
evil: [veil, vile, levi, live]
evil: [veil, vile, levi, live]
streets: [testers]
streets: [testers]
uprising: []
uprising: []
爲getAnagramsFor(串詞)當你讀allWords.txt時,你可以建立一個Map>。使用每個單詞的排序版本作爲鍵。當您想要查找單詞的字母時,只需對字母進行排序,然後從地圖中獲取列表。 –
Thevenin
getSortedByAnQty()應該做什麼?你能給個例子嗎? – Thevenin
getSortedByAnQty()從allwords.txt獲取單詞並找到anagrams。這是例子的第一部分。像那樣:[邪惡,levi,活,面紗,邪惡],[安第斯,丹麥人,院長,轎車]。方法必須返回一列字符。 – RomaSeba