让我们说你有“google”这个词并且给你其他字符串“glo”应该返回false,因为l在o之后所以字符不按顺序排列。如果给定字符串“goe”应该返回true,因为g-> o-> e是顺序的。
答案 0 :(得分:1)
您可以使用贪心算法执行此操作:
ind0
ind0
开始,查找序列中的第二个字母;记录其索引ind1
ind1
开始,查找序列中的第三个字母;记录其索引ind2
true
false
。该算法在单词中的字母数是线性的。如果存在解决方案,则此算法将发现它。直观地说,它永远不会超过匹配字母的索引ind...
;如果匹配,则匹配前面的字母不会阻止我们匹配以下字母。
答案 1 :(得分:0)
假设您只想回答一个查询,dasblinkenlight's solution就可以获得最佳效果。现在,如果您要对同一个基本字符串执行许多此类查询,请说B,(=" google",在您的示例中)并且您有O(|S|*N)
内存,其中S
是你正在处理的字母,N = len(B)
是基本字符串的大小,你可以这样做:
O(|S|*N)
时间内,计算NEXT(i, a) = Smallest j such that j>i and B[j]=a
。如果没有j
,NEXT(i,a) = inf
。另外,将NEXT(-1, a)
定义为a
的第一个出现。NEXT(-1, Q[0])
,NEXT(NEXT(-1,Q [0]),Q [1])...并确保它们都是有限的。这样,您需要O(|S|*N)
预处理时间,而每个查询都需要O(|Q|)
次。