为什么以下问题的所有测试用例都没有通过?

Why all the test cases are not getting passed for the below question?

我要解决的编码问题是这个。我试图解决但不是所有的测试用例都通过我找不到可能是什么原因?

识别可能的单词:侦探 Bakshi 在破案时偶然发现一封信,其中有很多单词,其中一个字符缺失,即单词中的一个字符被下划线代替。例如“Fi_er”。他还发现了一些细纸条,上面有一组用冒号分隔的单词,例如“Fever:filer:Filter:Fixer:fiber:fibre:tailor:offer”。他可以看出,少了一个字的那个词,是那些细纸条上可能出现的词之一。 Bakshi 侦探找到您(计算机程序员)寻求帮助,帮助您识别每个不完整单词的可能单词。

你需要编写一个函数来识别可能的单词集。 函数 identifyPossibleWords 将两个字符串作为输入 其中,

input1 包含不完整的单词,并且 input2 是包含一组由冒号分隔的单词的字符串。

该函数应该从 input2 中找到所有可能的词来替换不完整的词 input1,并且 return 结果采用下面建议的格式。

示例 1 -

输入 1 = “Fi_er” input2 = “Fever:filer:Filter:Fixer:fiber:fibre:tailor:offer”

输出字符串应return编辑为“FILER:FIXER:FIBER” 请注意 –

输出字符串应该包含可以替换input1中不完整单词的所有可能单词的集合 输出字符串中的所有单词都应以大写形式存储 输出字符串中的所有单词应按照它们在 input2 中出现的顺序出现,即在上面的示例中,我们有 FILER,然后是 FIXER,然后是 FIBER。 在 input2 中搜索 input1 时,忽略字母的大小写,即“Fi_er”与“filer”以及“Fixer”和“fiber”匹配。 重要提示:如果 input2 中的 none 个单词可能替换 input1,则输出字符串应包含字符串“ERROR-009” 假设:

Input1 将只包含一个单词,其中只有 1 个字符被下划线“_”替换 Input2 将包含一系列由冒号分隔的单词,中间没有 space 字符 Input2 将不包含除下划线和字母字符以外的任何其他特殊字符。

我的问题解答是:

 import java.io.*;
import java.util.*;
class UserMaincode
{
   public String indentifyPossibleWords(String input1, String input2)
{
       input1=input1.toUpperCase();
       input2=input2.toUpperCase();

       String arr1[]=input1.split("_");
       String arr2[]=input2.split(":");
       StringBuilder sb=new StringBuilder("");
       for(int i=0;i<arr2.length;i++){
           if(arr2[i].matches(arr1[0]+"."+arr1[1])){
               sb.append(arr2[i]+":");
           }
       }

       if(sb.length()!=0){
           sb.deleteCharAt(sb.length()-1);
       }

       String s=sb.toString();
       if(s==""){
           return "ERROR-009";
       }
       return s;
}
}

但是一些隐藏的测试用例没有通过。哪里有问题。

我从网上找到了一个代码,它通过了所有的测试用例。请参考此 link。

https://www.csinfo360.com/2020/01/cracking-coding-interview-step-11.html

有很多方法可以达到上述问题的预期结果。自从;您在标签中提到了 regex;因此,我将尝试使用正则表达式提供可能的解决方案。虽然;这也可以在没有他们的情况下实现。

建议程序:


 1. Create a regex from the given input1 i.e. replace the _ present anywhere inside input1 with regex dot (.) meta-character.
 2. Split the string based on :.
 3. Keep a count of length of spliced array of input2.
 4. for each item in input2:
      5. match using the regex formed in step 1
            If successful
              append to upper-cased result.
            else:
                 increment the counter.
6. if counter == length of spliced array i.e. no match found
    return "ERROR-009"
   else   
    return the appended result.

在java中执行上述程序:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
    public static void main(String[] args) {
        System.out.println(identifyPossibleWords("Fi_er", "Fever:filer:Filter:Fixer:fiber:fibre:tailor:offer"));
//      Fever:fiqqer:Filter:Fixxer:fibber:fibre:tailor:offer return ERROR-009
    }

    public static String identifyPossibleWords(String input1, String input2){
        input1 = input1.replace("_", ".");
        StringBuilder sb = new StringBuilder();
        int counter = 0;
        int lengthOfInput2 = input2.split(":").length;
        final Pattern pattern = Pattern.compile(input1, Pattern.CASE_INSENSITIVE);
        for(String str: input2.split(":")){
            Matcher matcher = pattern.matcher(str);
            if(matcher.matches())sb.append(matcher.group(0).toUpperCase() + "\n"); // \n to print in new line. You can edit the code accordingly.
            else counter++;
        }
        if(counter == lengthOfInput2)return "ERROR-009";
        return sb.toString();
    }
}

您可以在 here.

中找到上述实现的示例 运行

轻松修复--->

    input1=input1.toUpperCase();
    input2=input2.toUpperCase();

   String arr1[]=input1.split("_");
   String arr2[]=input2.split(":");
   StringBuilder sb=new StringBuilder("");
   for(int i=0;i<arr2.length;i++){
       if(arr2[i].matches(arr1[0]+"."+arr1[1])){
           sb.append(arr2[i]+":");
       }
   }

   if(sb.length()!=0){
       sb.deleteCharAt(sb.length()-1);
   }

   String x = "ERROR-009";

   String s=sb.toString();
   if(sb.length()==0){                         // this 
       return x.toString();
   }
   return s;


}

}