Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何查找最短唯一子字符串的长度以及给定字符串中相同长度的所有唯一子字符串的出现次数_String_Algorithm - Fatal编程技术网

String 如何查找最短唯一子字符串的长度以及给定字符串中相同长度的所有唯一子字符串的出现次数

String 如何查找最短唯一子字符串的长度以及给定字符串中相同长度的所有唯一子字符串的出现次数,string,algorithm,String,Algorithm,问题是找到最短唯一子字符串的长度和字符串中出现的相同长度唯一子字符串的数目。例如,“aatcc”将有“t”作为最短长度唯一子串,长度为1,因此输出为1,1。另一个例子是“aacc”,这里的输出是2,3,因为字符串是aa、ac、cc 我试图解决它,但只能想出一个蛮力解决方案,即循环所有可能的子字符串。它超过了时限 我在谷歌上搜索了一下,找到了一些对后缀数组的引用,但不太清楚。 那么这个问题的最佳解决方案是什么呢 编辑:忘了提及解决此问题所需的关键要求,即不使用输入和输出函数以外的任何库函数分别读取

问题是找到最短唯一子字符串的长度和字符串中出现的相同长度唯一子字符串的数目。例如,“aatcc”将有“t”作为最短长度唯一子串,长度为1,因此输出为1,1。另一个例子是“aacc”,这里的输出是2,3,因为字符串是aa、ac、cc

我试图解决它,但只能想出一个蛮力解决方案,即循环所有可能的子字符串。它超过了时限

我在谷歌上搜索了一下,找到了一些对后缀数组的引用,但不太清楚。 那么这个问题的最佳解决方案是什么呢

编辑:忘了提及解决此问题所需的关键要求,即不使用输入和输出函数以外的任何库函数分别读取和写入标准输入和标准输出

编辑:我找到了另一个使用trie数据结构的解决方案

Pseudocode:
for i from 1 to length(string) do
  for j from 0 to length(string)-1 do
     1. create a substring of length i from jth character
     2. if checkIfSeen(substring) then count-- else count++ 
  close inner for loop
  if count >= 1 then break
close outer for loop
print i(the length of the unique substring), count (no. of such substrings)

checkIfSeen(Substring) will use a trie data structure which 
will run O(log l) where l is the average length of the prefixes.

该算法的时间复杂度为O(n^2 logl),其中如果前缀的平均长度为n/2,则时间复杂度为O(n^2 logn)。如果有错误,请指出错误,如果可能,请指出改进运行时间的方法。

抱歉,但请记住,我的答案基于我用Python编写的程序,但可以应用于任何编程语言:)

现在我相信暴力方法确实是解决这个问题所需要做的。但我们能做的是缩短时间:

1:从最小的子字符串长度开始蛮力,即 一,

2:在子字符串长度为1的字符串中循环后(数据 将看起来像{“a”:2,“t”:1,“c”:2}表示“aatcc”),检查 任何子字符串只出现一次。如果发生了,则按 循环浏览字典(在您给出的示例中为“t” 仅出现一次,因此出现次数为1)

3:计算发生次数后,中断循环,使其不会 必须浪费时间来计算其余较大的子字符串

4:在2:上,如果未找到唯一的子字符串,请重置字典 然后尝试一个更大的子字符串(数据可以是类似{“aa”:1,“ac”:1, “cc”:1表示“aacc”})。最终,不管发生什么,都会找到唯一的子字符串(例如,在字符串“aaaaa”中,唯一的子字符串是“aaaaa”,数据为{“aaaaa”:1})

以下是Python的实现:

def countString(string):
    for i in range(1, len(string)+1): #start the brute force from string length 1

        dictionary = {}
        for j in range(len(string)-i+1):  #check every combination.

            #count the substring occurrences
            try:
                dictionary[string[j:j+i]] += 1
            except:
                dictionary[string[j:j+i]] = 1

        isUnique = False #loop stops if isUnique is True
        occurrence= 0
        for key in dictionary: #iterate through the dictionary
            if dictionary[key] == 1: #check if any substring is unique
                #if found, get ready to escape from the loop and increase the occurrence
                isUnique = True
                occurrence+=1

        if isUnique: 
            return (i, occurrence)

print(countString("aacc")) #prints (2,3)
print(countString("aatcc")) #prints (1,1)

我很确定这种设计相当快,但总有更好的方法。但无论如何,我希望这会有所帮助:)

您是否尝试过从最长的字符串s开始,从左到右截断它以生成长度为l-1的单词(等等)。对于每个长度相同的单词,将它们存储在一个trie中,如果在trie中找到,不要在下一个截断步骤中截断它们?没有办法生成所有子字符串,这是肯定的。但我认为关键在于我们检查子字符串是否已经找到。这和我脑海中的解决方案是一样的。这导致了TLE。