检查子字符串字符是主字符串的顺序

时间:2014-07-16 01:24:51

标签: java algorithm

让我们说你有“google”这个词并且给你其他字符串“glo”应该返回false,因为l在o之后所以字符不按顺序排列。如果给定字符串“goe”应该返回true,因为g-> o-> e是顺序的。

2 个答案:

答案 0 :(得分:1)

您可以使用贪心算法执行此操作:

  • 开始找到单词中序列的第一个字母;记录其索引ind0
  • ind0开始,查找序列中的第二个字母;记录其索引ind1
  • ind1开始,查找序列中的第三个字母;记录其索引ind2
  • 继续此过程,直到(a)序列中的字母用完,或(b)找不到单词中的下一个字母
  • 如果序列中的字母用完,请返回true
  • 否则,请返回false

该算法在单词中的字母数是线性的。如果存在解决方案,则此算法将发现它。直观地说,它永远不会超过匹配字母的索引ind...;如果匹配,则匹配前面的字母不会阻止我们匹配以下字母。

答案 1 :(得分:0)

假设您只想回答一个查询,dasblinkenlight's solution就可以获得最佳效果。现在,如果您要对同一个基本字符串执行许多此类查询,请说B,(=" google",在您的示例中)并且您有O(|S|*N)内存,其中S是你正在处理的字母,N = len(B)是基本字符串的大小,你可以这样做:

  1. O(|S|*N)时间内,计算NEXT(i, a) = Smallest j such that j>i and B[j]=a。如果没有jNEXT(i,a) = inf。另外,将NEXT(-1, a)定义为a的第一个出现。
  2. 给定一个查询字符串Q,检查找到NEXT(-1, Q[0]),NEXT(NEXT(-1,Q [0]),Q [1])...并确保它们都是有限的。
  3. 这样,您需要O(|S|*N)预处理时间,而每个查询都需要O(|Q|)次。