P.S:If you don't understand anything from the below I describe, please ask me
我有一本包含单词列表的字典。 而且我有一个单词的字符串,其中包含多个字符。
例如:词典=>
String[] = {"Manager","age","range", "east".....} // list of words in dictionary
现在我有一个字符串tageranm
。
我必须在字典中找到所有可以使用此字符串制作的单词。我已经可以使用Permuation创建所有字符串并找到该字符串,并验证字典中是否存在该字符串。
但是我有另一种解决方案,但是一点也不知道如何使用 Regex
在Java中完成此操作算法:
// 1. Sort `tageranm`.
char c[] = "tageranm".toCharArray();
Arrays.sort(c);
letters = String.valueOf(c); // letters = "aaegmnrt"
2.Sort all words in dictionary:
Example: "range" => "aegnr" // After sorting
现在,如果我将使用"aaegmnrt".contains("aegnr")
将返回false。 'm'
介于两者之间。
是否可以使用正则表达式忽略字符m
并使用上述方法获得字典中的所有单词?
先谢谢了。
答案 0 :(得分:2)
使用@MattTimmermans in the comments所述的正则表达式类型是可行的解决方案。不过,它的速度不是很快,因此可能有很多方法可以改善此问题。.我也很确定应该有针对此类搜索的库,(有希望)它将使用降低性能的算法。
java.util.List<String> test(String[] words, String input){
java.util.List<String> result = new java.util.ArrayList<>();
// Sort the characters in the input-String:
byte[] inputArray = input.getBytes();
java.util.Arrays.sort(inputArray);
String sortedInput = new String(inputArray);
for(String word : words){
// Sort the characters of the word:
byte[] wordArray = word.getBytes();
java.util.Arrays.sort(wordArray);
String sortedWord = new String(wordArray);
// Create a regex to match from this word:
String wordRegex = ".*" + sortedWord.replaceAll(".", "$0.*");
// If the input matches this regex:
if(sortedInput.matches(wordRegex))
// Add the word to the result-List:
result.add(word);
}
return result;
}
Try it online (with added DEBUG-lines to see what's happening).
对于您的输入{"Manager","age","range", "east"}
和"tageranm"
,它将返回["age", "range"]
。
编辑:与Manager
不匹配,因为M
大写。如果要使用不区分大小写的匹配,最简单的方法是在检查之前将输入和单词转换为相同的大小写:
input.getBytes()
成为input.toLowerCase().getBytes()
word.getBytes()
成为word.toLowerCase().getBytes()
Try it online(现在是["Manager", "age", "range"]
)。