前任:
如果有句子: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”的长度相同。在比较中,您只考虑单词的数量是否已最小化,而不考虑单词的长度是否已缩短。