前任:
如果有句子:
My name is not eugene. my pet name is not eugene.
我们必须搜索句子中包含给定单词的最小部分
我和尤金
那么答案就是
eugene. my
无需检查大小写或特殊字符或数字。
我已经粘贴了代码,但在一些测试用例中得到了错误的答案。
有人知道代码有什么问题吗我没有错误的测试用例。

import java.io.*;
import java.util.*;
public class ShortestSegment
{
static String[] pas;
static String[] words;
static int k,st,en,fst,fen,match,d;
static boolean found=false;
static int[] loc;
static boolean[] matches ;
public static void main(String s[]) throws IOException
{
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    pas = in.readLine().replaceAll("[^A-Za-z ]", "").split(" ");
    k = Integer.parseInt(in.readLine());
    words = new String[k];
    matches = new boolean[k];
    loc = new int[k];
    for(int i=0;i<k;i++)
    {
        words[i] = in.readLine();
    }
    en = fen = pas.length;
    find(0);
    if(found==false)
    System.out.println("NO SUBSEGMENT FOUND");
    else
    {
        for(int j=fst;j<=fen;j++)
            System.out.print(pas[j]+" ");
    }

}
private static void find(int min)
{
    if(min==pas.length)
        return;
    for(int i=0;i<k;i++)
    {
        if(pas[min].equalsIgnoreCase(words[i]))
        {
            if(matches[i]==false)
            {
                loc[i]=min;
                matches[i] =true;
                match++;
            }
            else
            {
                    loc[i]=min;
            }
            if(match==k)
            {
                en=min;
                st = min();
                found=true;
                if((fen-fst)>(en-st))
                {
                    fen=en;
                    fst=st;
                }
                match--;
                matches[getIdx()]=false;
            }
        }
    }
    find(min+1);
}
private static int getIdx()
{
    for(int i=0;i<k;i++)
    {
        if(words[i].equalsIgnoreCase(pas[st]))
            return i;
    }
    return -1;
}
private static int min()
{
    int min=loc[0];
    for(int i=1;i<loc.length;i++)
        if(min>loc[i])
            min=loc[i];
    return min;
}


}

最佳答案

您给出的代码将为以下输入产生不正确的输出。我假设,当你想“找到包含给定单词的句子的最短部分”时,单词的长度也很重要
我的名字是尤金我的儿子是尤金。
搜索字符串数:2
string1:'我的'
string2:'是'
你的答案是:“我的名字是”
正确答案是:“我的fn是”
代码中的问题是,它认为“firstname”和“fn”的长度相同。在比较中,您只考虑单词的数量是否已最小化,而不考虑单词的长度是否已缩短。

09-30 14:09