如果两个英语单词只包含相同的字母,则它们是相似的。例如,食物和好东西并不相似,但狗和好东西是相似的。(如果A与B相似,则A中的所有字母都包含在B中,B中的所有字母都包含在A中。)
给定一个单词W和一个单词L列表,查找L中与W相似的所有单词。将字数打印到标准输出。
例子:
输入(标准输入):
love
velo low vole lovee volvell lowly lower lover levo loved love lovee lowe lowes lovey lowan lowa evolve loves volvelle lowed love
输出(标准输出):
14
说明:
L中与love相似的词是:velo vole love volvell lover levo love love lovey evolve loves volvelle love
总计14个。
因此,我目前的解决方案如下:
public static void main(String[] args) {
String[] arr = new String[]{"velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",
"lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"};
String s = "love";
int result = 0;
Pattern p = Pattern.compile(buildPattern(s));
for (String val : arr) {
if (p.matcher(val).find()) result++;
}
System.out.println(result);
}
private static String buildPattern(String s) {
String pattern = "^";
for (int i = 0; i < s.length(); i++) {
pattern += "(?=.*" + s.charAt(i) + ")";
}
return pattern;
}
我想知道我的简单代码是否有任何改进。
Aho Corasick是否适用于解决方案?
我会尽量避免为此使用正则表达式,并会自己检查字母。
public static void main(String[] args)
{
String[] arr = new String[]{"velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",
"lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"};
String s = "love";
int result = 0;
for (String word : arr)
{
if (isSimilar(s, word))
{
result++;
}
}
System.out.println(result);
}
private static boolean isSimilar(String word, String test)
{
for (char c : test.toCharArray())
{
if (word.indexOf(c) == -1)
{
return false;
}
}
return true;
}
虽然目前我上面的例子只返回10
?
我建议简化正则表达式,不需要前瞻,简单的“^[love]*$”就可以了。
private static String buildPattern(String s) {
String pattern = "^[";
for (int i = 0; i < s.length(); i++) {
pattern += s.charAt(i);
}
pattern += "]*$";
return pattern;
}
由于只有26个字母,而int
中有32位,因此int
足够大,可以保存有关单词中出现哪些字母的所有信息:
static int getFingerprint(String s)
{
int result=0;
for (int i = s.length()-1; i>=0; --i) {
char c = s.charAt(i);
if (c>='a' && c<='z')
result |= 1<<(int)(c-'a');
else if (c>='A' && c<='Z')
result |= 1<<(int)(c-'A');
}
return result;
}
public static void main(String[] args) {
String[] arr = new String[]{"velo", "low", "vole", "lovee", "volvell", "lowly", "lower", "lover", "levo", "loved", "love",
"lovee", "lowe", "lowes", "lovey", "lowan", "lowa", "evolve", "loves", "volvelle", "lowed", "love"};
String s = "love";
int fingerprint = getFingerprint(s);
int matches = 0;
for (String item : arr) {
if (getFingerprint(item)==fingerprint)
++matches;
}
System.out.println(matches);
}
问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案:
问题内容: 我需要检查单词中是否存在元音。如果是这样,应对“说”一词进行操作。我想避免for循环,因为我想到了这一点: 请推荐一种执行时间成本较低的方法。另外,也请帮助我纠正上述方法。 问题答案: vowels = {“a”, “e”, “i”, “o”, “u”, “A”, “E”, “I”, “O”, “U”} if any(char in vowels for char in word):
问题内容: 我之前已经找到了这个问题的一些答案,但是对于当前的Python版本似乎已经过时了(或者至少它们对我不起作用)。 我想检查子字符串是否包含在字符串列表中。我只需要布尔结果。 我找到了这个解决方案: 我希望从这段代码中得到一个价值。如果单词是“ der”,则输出应为。 但是,结果是一个生成器函数,我找不到找到该值的方法。 任何想法? 问题答案: 您可以导入从的情况下,它是由一些其他的替代:
问题内容: 如何检查数组中的任何字符串是否在另一个字符串中? 喜欢: 该代码行不通,只是为了展示我想要实现的目标。 问题答案: 你可以使用: 同样,要检查是否找到了列表中的所有字符串,请使用all代替any。
问题内容: 我正在使用Python v2,并且试图找出是否可以判断字符串中是否包含单词。 我发现了一些有关识别单词是否在字符串中的信息-使用.find,但是有一种方法可以执行IF语句。我想要以下内容: 谢谢你的帮助。 问题答案: 出什么问题了:
编辑:如何让js检查字符串是否包含数组的任何字符串,如var arrayVar=[“bing”,“google”];如果像“google是最好的吗?”这样的字符串,请检查它是否包含数组中的内容。这可能吗?