假设我有一个这样的词; mert 。我想搜索该单词的所有1个字母差异组合。 aert,ert,肉,mmert,merst,merts 等均适用。所以我的正则表达式就像
[a-z]{0,2}ert OR m[a-z]{0,2}rt OR me[a-z]{0,2}t OR mer[a-z]{0,2}
对于n个字母的差异,我只将2替换为n-1,而您不能获得所有组合。
我的问题是这个;有没有更短的编写此正则表达式的方法?
谢谢
答案 0 :(得分:1)
请检查此解决方案,我已经在下面测试了此代码。它似乎有效。
/**
* Then function will return list of the words matched with nth_difference
*
* @param pattern search pattern
* @param data input data
* @param nth_difference difference
* @return
*/
static List<String> getNthDifferenceWords(String pattern, String[] data, int nth_difference) {
Map<Character, Integer> frequencyTable = new HashMap<>();
List<String> matchedWords = new ArrayList<>();
//Code complexity : O(n)
for (int i = 0; i < pattern.length(); ++i) {
frequencyTable.put(pattern.charAt(i), 1);
}
//Code complexity : O(m) where m is size of entire input;
for (String input : data) {
int matchCounter = 0;
for (int j=0; j<input.length(); ++j){
if(frequencyTable.containsKey(input.charAt(j))){
++matchCounter;
}
}
//System.out.println("matched=" + matchCounter);
if(input.length() <= pattern.length() && (matchCounter == pattern.length() - nth_difference)){
matchedWords.add(input);
}
if((input.length() - pattern.length() == 1) && (matchCounter >= input.length() - nth_difference)){
matchedWords.add(input);
}
}
return matchedWords;
}
public static void main(String[] args) {
int nth_difference = 1;
String pattern = "mert";
String[] data = new String[]{"aert", "ert", "meat", "mmert", "merst", "merts","meritos"};
System.out.println(getNthDifferenceWords(pattern,data,nth_difference));
nth_difference = 2;
pattern = "merit";
data = new String[]{"aert", "ert", "meat", "mmert", "merst", "merts","demerit","merito", "meritos"};
System.out.println(getNthDifferenceWords(pattern,data,nth_difference));
}
答案 1 :(得分:1)
要区分1个字母,请按以下方式预先构建表格。用第二列中的“单词”构建一个2列词典,第一列中包含以下内容:一次定位,从单词中删除一个字母。
示例:“肉”是单词;这是表格中的行:
`col1` `col2`
------ ------
meat meat
eat meat
mat meat
met meat
mea meat
对于“满足”(注意重复字母):
meet meet
eet meet
met meet -- only needed once
mee meet
然后以类似方式进行测试。搜索“ mert”时,请
WHERE col1 IN ('mert', 'ert', 'mrt', 'met', 'ert')
请注意,您将从上面的示例中同时获得“肉”和“会议”。还要注意“ met”和“ meets”会发生什么。
并且,它检查简单的换位。搜索“元”:
WHERE col1 IN ('meta', 'eta', 'mta', 'mea', 'met')
可以找到“肉”,“满足”(以及诸如met,mean等之类的词语)。可以说,“ meta”->“ mean”是2个字母的距离,但是很好。
检查您的测试用例-Mert vs
aert-通过“ ert”
ert –通过“ ert”
肉-通过“ met”
mmert –通过“ mert”
merst-通过“ mert”
merts-通过“ mert”
同时,在该表上放置PRIMARY KEY(col1, col2), INDEX(col2)
。