gpt4 book ai didi

java - 从通配符生成新单词

转载 作者:行者123 更新时间:2023-12-01 11:37:22 25 4
gpt4 key购买 nike

我正在尝试生成一个带有通配符的单词,并检查该单词是否存储在字典数据库中。像“appl*”应该返回 apply 或 apple。然而,当我有两张通配符时,问题就出现了。 “app**” 将生成诸如 appaa、appbb..appzz... 之类的单词,而不是 apple。第二个 if 条件仅适用于不包含通配符“*”的常规字符串

 public static boolean printWords(String s) {
String tempString, tempChar;
if (s.contains("*")) {

for (char c = 'a'; c <= 'z'; c++) {

tempChar = Character.toString(c);
tempString = s.replace("*", tempChar);

if (myDictionary.containsKey(tempString) == true) {
System.out.println(tempString);
}
}
}
if (myDictionary.containsKey(s) == true) {
System.out.println(s);
return true;
} else {
return false;
}
}

最佳答案

您仅对字符使用单个 for 循环,并将 * 的所有实例替换为该字符。 See the API for String.replace here 。因此,您获得 Appaa、Appbb 等字符串也就不足为奇了。

如果您想实际使用正则表达式,那么您不应该执行任何 String.replace 或 contains 等操作。请参阅 Anubian 的答案以了解如何处理您的问题。

如果您将此视为字符串练习并且不想使用正则表达式,那么执行您实际尝试执行的操作(尝试每个通配符的所有字母组合)的最简单方法就是执行此操作递归地。如果字符串中没有留下通配符,请检查它是否是单词,如果是则打印。如果存在通配符,请尝试用一个字符替换该通配符,然后在创建的字符串上递归调用该函数。

public static void printWords(String s){
int firstAsterisk = s.indexOf("*");
if(firstAsterisk == -1){ // doesn't contain asterisk
if (myDictionary.containsKey(s))
System.out.println(s);
return;
}

for(char c = 'a', c <= 'z', c++){
String s2 = s.subString(0, firstAsterisk) + c + s.subString(firstAsterisk + 1);
printWords(s2);
}
}

根本原因依赖于the indexOf function - 当indexOf返回-1时,这意味着给定的子字符串(在我们的例子中为“*”)不会出现在字符串中 - 因此没有更多的通配符可以替换。

子字符串部分基本上重新创建原始字符串,并将第一个星号替换为字符。因此,假设 s = "abcd**ef"c='z',我们知道 firstAsterisk = 4(字符串为 0-索引,索引 4 有第一个“*”)。因此,

String s2 = s.subString(0, firstAsterisk) + c + s.subString(firstAsterisk + 1);
= "abcd" + 'z' + "*ef"
= "abcdz*ef"

关于java - 从通配符生成新单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29832384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com