我有一个程序要求我找到给定字符串的最短子段,其中包含单词列表。即使我的程序是正确的,我也未能在执行时间范围内(5 秒)交付。我认为问题出在我使用的复杂(琐碎)算法上。它由嵌套循环组成,需要对 list_of_words 数组进行多次扫描。这是我的搜索功能代码。a[]
包含由单词存储的原始字符串,b[]
包含要找到以形成子段的单词列表。String g
存储由原始字符串中的单词组成的临时子段,包括列表中的单词。
private static void search() // Function to find the subsegment with a required list of words
{
int tail,x;//counters
String c[]=new String[b.length]; //initializing a temporary array to copy the list of words array.
for(int i =0; i<a.length;i++)// looping throw original string array
{
System.arraycopy(b, 0, c, 0, b.length);//copying the list of words array to the temporary array
for (int j=0;j<b.length;j++)//looping throw the temporary array
{
x=0; //counter for temporary array
if(a[i].equalsIgnoreCase(b[j]))//checking for a match with list of words
{
tail=i;
//adds the words starting from the position of the first found word(tail) till all the words from the list are found
while((x<b.length)&&(tail<a.length))
{
g=g+" "+a[tail];//adds the words in the string g
for(int k=0;k<c.length;k++) //checks for the found word from the temporary array and replaces it with ""
{
if(c[k].equalsIgnoreCase(a[tail]))
{
c[k]=""; x++;
}
}
tail++;
}
if((tail==a.length)&&(x!=b.length))//checks if the string g does not contains all the listed word
{
g="";
}
else
{
count(g);g="";//check for the shortest string.
}
}
}
}print();
}
样本 :
原始字符串:这是一个测试。这是一个编程测试。这是一个编程测试。
要找到的词:this,test,a,programming。
细分:
这是一个测试 这是一个编程
这是一个编程测试
一个编程测试一个编程测试这个
编程测试 编程测试 this
测试一个编程测试这个
一个编程测试这个
最短子段:一个编程测试这个
任何有关数据结构或循环结构的更改,甚至优化相同的算法的更改的建议都会有所帮助。